1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PostgreSQL でクライアント証明書認証を行うには

Last updated at Posted at 2022-04-12

PostgreSQL でクライアント証明書認証を行う手順は以下のとおりです。

  1. 自己署名でサーバ証明書を作成します。

    $ openssl req -new -x509 -days 3650 -nodes -text -out $PGDATA/server.crt \
        -keyout $PGDATA/server.key -subj /CN=node-1
    Generating a RSA private key
    .......................................................+++++
    .....................+++++
    writing new private key to '/var/lib/pgsql/14/data/server.key'
    -----
    

    -days には証明書の有効期間 (日)、-subjCN にはサーバ接続時のホスト名を指定します。

  2. サーバ証明書をルート証明書としてコピーします。

    $ cp $PGDATA/server.crt $PGDATA/root.crt
    
  3. postgresql.conf を編集します。

    $PGDATA/postgresql.conf
    listen_addresses = '*'
    ssl = on
    ssl_ca_file = 'root.crt
    

    listen_addresses = '*' で別ホストからの接続、ssl = on で SSL 接続を有効にし、ssl_ca_file にはルート証明書を指定します。

  4. pg_hba.conf を編集します。

    $PGDATA/pg_hba.conf
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    hostssl all             all             172.28.128.0/24         cert
    

    TYPE には SSL 接続の hostsslMETHOD には cert か、任意の認証方式とオプションとして clientcertverify-full か、verify-ca を指定します。verify-ca は証明書のみ、verify-fullcert はユーザ名の一致も検証します。バージョン 11 以前は verify-ca 相当の 1cert にしか対応していません。

  5. 設定変更を反映するため、サーバを再起動します。

    $ /usr/pgsql-14/bin/pg_ctl restart
    サーバー停止処理の完了を待っています....完了
    サーバーは停止しました
    サーバーの起動完了を待っています....2022-04-12 20:50:25.622 JST [9785] LOG:  redirecting log output to logging collector process
    2022-04-12 20:50:25.622 JST [9785] HINT:  Future log output will appear in directory "log".
    完了
    サーバー起動完了
    
  6. クライアント証明書の格納先を作成します。

    $ mkdir ~/.postgresql
    
  7. クライアント証明書を作成します。

    $ openssl req -new -nodes -text -out ~/.postgresql/postgresql.csr \
        -keyout ~/.postgresql/postgresql.key -subj /CN=postgres
    Generating a RSA private key
    ...............+++++
    .....................+++++
    writing new private key to '/var/lib/pgsql/.postgresql/postgresql.key'
    -----
    

    -subjCN にはサーバ接続時のユーザ名を指定します。

  8. ルート証明書の代わりにサーバ証明書でクライアント証明書に署名します。

    $ openssl x509 -req -in ~/.postgresql/postgresql.csr -text -days 3650 \
        -CA $PGDATA/server.crt -CAkey $PGDATA/server.key -CAcreateserial \
        -out ~/.postgresql/postgresql.crt
    Signature ok
    subject=CN = postgres
    Getting CA Private Key
    

    -days には証明書の有効期間 (日) を指定します。

  9. クライアント証明書の署名要求を削除します。

    $ rm -f ~/.postgresql/postgresql.csr
    
  10. ルート証明書をコピーします。

    $ cp $PGDATA/root.crt ~/.postgresql
    
  11. サーバに接続できるかを確認します。

    $ psql -h node-1
    psql (14.2)
    SSL 接続 (プロトコル: TLSv1.3、暗号化方式: TLS_AES_256_GCM_SHA384、ビット長: 256、圧縮: オフ)
    "help"でヘルプを表示します。
    
    postgres=# \q
    

    ~/.postgresql ディレクトリを別ホストにコピーすれば、別ホストからでも接続できます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?