PostgreSQL でクライアント証明書認証を行う手順は以下のとおりです。
-
自己署名でサーバ証明書を作成します。
$ 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
には証明書の有効期間 (日)、-subj
のCN
にはサーバ接続時のホスト名を指定します。 -
サーバ証明書をルート証明書としてコピーします。
$ cp $PGDATA/server.crt $PGDATA/root.crt
-
postgresql.conf
を編集します。$PGDATA/postgresql.conflisten_addresses = '*' ssl = on ssl_ca_file = 'root.crt
listen_addresses = '*'
で別ホストからの接続、ssl = on
で SSL 接続を有効にし、ssl_ca_file
にはルート証明書を指定します。 -
pg_hba.conf
を編集します。$PGDATA/pg_hba.conf# TYPE DATABASE USER ADDRESS METHOD hostssl all all 172.28.128.0/24 cert
TYPE
には SSL 接続のhostssl
、METHOD
にはcert
か、任意の認証方式とオプションとしてclientcert
にverify-full
か、verify-ca
を指定します。verify-ca
は証明書のみ、verify-full
とcert
はユーザ名の一致も検証します。バージョン 11 以前はverify-ca
相当の1
とcert
にしか対応していません。 -
設定変更を反映するため、サーバを再起動します。
$ /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". 完了 サーバー起動完了
-
クライアント証明書の格納先を作成します。
$ mkdir ~/.postgresql
-
クライアント証明書を作成します。
$ 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' -----
-subj
のCN
にはサーバ接続時のユーザ名を指定します。 -
ルート証明書の代わりにサーバ証明書でクライアント証明書に署名します。
$ 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
には証明書の有効期間 (日) を指定します。 -
クライアント証明書の署名要求を削除します。
$ rm -f ~/.postgresql/postgresql.csr
-
ルート証明書をコピーします。
$ cp $PGDATA/root.crt ~/.postgresql
-
サーバに接続できるかを確認します。
$ psql -h node-1 psql (14.2) SSL 接続 (プロトコル: TLSv1.3、暗号化方式: TLS_AES_256_GCM_SHA384、ビット長: 256、圧縮: オフ) "help"でヘルプを表示します。 postgres=# \q
~/.postgresql
ディレクトリを別ホストにコピーすれば、別ホストからでも接続できます。