Postgresql psql:致命:连接需要有效的客户端证书

Postgresql psql:致命:连接需要有效的客户端证书,postgresql,ssl,openssl,psql,Postgresql,Ssl,Openssl,Psql,我试图连接到我的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 -

我试图连接到我的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
客户端证书:

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更改为添加到“安全和身份验证”部分:


成功了!非常感谢你

在这种情况下,我倾向于拉出Wireshark并窥探SSL协商,以确保客户端证书确实是由客户端提供的

我建议也使用openssl来验证client->root签名链接

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

编辑:即使选择了认证,也必须指定
clientcert=1
。是的,这很奇怪。

请参见编辑,我不知道如何很好地解释捕获。@platypus首先,您应该告诉Wireshark将其解释为SSL。分析->解码为->传输->SSL。然后查看握手过程,看看客户端是否确实向服务器提供了证书。@platypus请尝试附加
clientcert=1
。非常感谢。我非常感谢你的帮助。我花了一整天的时间试图了解出了什么问题。再次非常感谢你!!!(见编辑#3:-)@platypus看起来我们需要改进文档。