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 消息。如下所示:

在此处输入图像描述

但这很奇怪,因为在 pg_hba.conf 中,我有:

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

In this situation I tend to pull out Wireshark and snoop the SSL negotiation to make sure the client certificate is really being offered by the client.

I suggest using openssl to verify the client->root signing link, too.

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

Edit: It's necessary to specify clientcert=1 even when cert authentication is chosen. Yes, that's weird.

于 2013-08-28T23:50:45.727 回答
0

只是在这里为其他人添加另一个答案。使用 org.postgresql.driver 从 jdbc 连接时,我遇到了同样的错误。问题是我为 sslkey 参数传递的密钥格式是 pem 格式。这个链接解释了它。

https://jdbc.postgresql.org/documentation/head/connect.html#:~:text=keyfile.-,sslkey,-%3D%20String

Note: The key file must be in PKCS-12 or in PKCS-8 DER format. A PEM key can be converted to DER format using the openssl command:

openssl pkcs8 -topk8 -inform PEM -in postgresql.key -outform DER -out postgresql.pk8 -v1 PBE-MD5-DES
于 2021-08-05T21:56:04.100 回答