24

PostgreSQL サーバーに接続しようとしていますが、psql が有効なクライアント証明書を持っていないと不平を言っています。証明書を作成する方法は次のとおりです。

自己署名サーバー証明書:

openssl req -new -text -nodes -keyout server.key -out server.csr -subj '/C=US/ST=California/L=Fremont/O=Example/OU=CoreDev/CN=192.168.0.100' # CN is the server's IP address
openssl req -x509 -text -in server.csr -key server.key -out server.crt
cp server.crt root.crt
rm server.csr
chmod og-rwx server.key

クライアント証明書:

openssl req -new -nodes -keyout client.key -out client.csr -subj '/C=US/ST=California/L=Fremont/O=Example/OU=CoreDev/CN=postgres' # postgres is the database user name
openssl x509 -req -CAcreateserial -in client.csr -CA root.crt -CAkey server.key -out client.crt
rm client.csr

必要なファイル (client.crt、client.key、root.crt) をクライアント マシンにコピーし、パーミッション (つまり、chmod og-rwx client.key) を変更した後、次のことを行います。

psql 'host=192.168.0.100 port=5432 dbname=postgres user=postgres sslmode=verify-full sslcert=client.crt sslkey=client.key sslrootcert=root.crt'

そして、私は得る:

psql: FATAL:  connection requires a valid client certificate

クライアント証明書の署名プロセスが間違っていますか?

ありがとう、

#編集

私は試した:

openssl verify -CAfile root.crt -purpose sslclient client.crt

そして私は得る:

client.crt: OK

Wireshark を使用して、クライアント (192.168.0.103) とサーバー (192.168.0.100) の間の通信で取得したキャプチャを次に示します。

ここに画像の説明を入力

これを理解する方法を知っていますか?

#編集 2

わかりました、私はあなたが言ったことをしました、そして、サーバーがCertificateRequestメッセージをクライアントに送信していないようです..以下に示すように:

ここに画像の説明を入力

しかし、これは奇妙です。

hostssl all             postgres        192.168.0.103/32        cert

どう思いますか?

#Edit3 (解決済み!)

pg_hba.conf を次の内容に変更しました。

hostssl all             postgres        192.168.0.103/32        cert clientcert=1

postgresql.conf を変更して、「セキュリティと認証」セクションに追加しました。

ssl_ca_file = 'root.crt'

そしてそれはうまくいきました!どうもありがとう!

4

2 に答える 2

11

この状況では、Wireshark を取り出して SSL ネゴシエーションをスヌープし、クライアント証明書が実際にクライアントによって提供されていることを確認する傾向があります。

openssl を使用して、client->root 署名リンクも検証することをお勧めします。

openssl verify -CAfile root.crt -purpose sslclient client.crt

編集:認証を選択clientcert=1した場合でも指定する必要があります。certはい、変です。

于 2013-08-28T23:50:45.727 に答える