我正在尝试连接到我的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)之间进行通信的捕获:
你知道怎么理解这个吗?
好的,我做了你说的,看起来服务器没有将CertificateRequest消息发送给客户端..如下所示:
但这很奇怪,因为在pg_hba.conf中,我有:
hostssl all postgres 192.168.0.103/32 cert
您怎么看?
我更改了pg_hba.conf以包含:
hostssl all postgres 192.168.0.103/32 cert clientcert=1
并更改了postgresql.conf以添加到“安全和身份验证”部分:
ssl_ca_file = 'root.crt'
和它一起工作!非常感谢你!
答案 0 :(得分:8)
在这种情况下,我倾向于拔出Wireshark并窥探SSL协商,以确保客户端证书真正由客户提供。
我建议使用openssl验证客户端 - > root签名链接。
openssl verify -CAfile root.crt -purpose sslclient client.crt
编辑:即使选择了clientcert=1
身份验证,也必须指定cert
。是的,这很奇怪。
答案 1 :(得分: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