我正在尝试设置我的 postgres 服务器来进行 ssl 连接。我正确设置了 postgresql.conf 和 pg_hba.conf 。我在 postgres 数据目录中创建了一个密钥和自签名证书(server.crt 和 server.key),并将 server.crt 复制到 root.crt。
我还在另一台主机上使用服务器中的 root.crt 设置了证书和密钥来签署客户端证书。当我使用 openssl 测试证书时,一切都很好。但是,当我尝试连接到 postgres 服务器时,它失败了:
psql -h <HOSTNAME> -U <USER> -d <DB>
psql: SSL error: certificate verify failed
Run Code Online (Sandbox Code Playgroud)
或者:
openssl s_client -connect <HOSTNAME>:5432 -state -msg -showcerts -debug
CONNECTED(00000003)
SSL_connect:before/connect initialization
write to 080ACFE0 [080AD570] (145 bytes => 145 (0x91))
0000 - 80 8f 01 03 01 00 66 00-00 00 20 00 00 39 00 00 ......f... ..9..
...
0080 - 04 fd be bd 49 e7 1d 99-f5 bb 7e 24 2e fe 34 e8 ....I.....~$..4.
0090 - d7 .
>>> SSL 2.0 [length 008f], CLIENT-HELLO
01 03 01 00 66 00 00 00 20 00 00 39 00 00 38 00
...
be bd 49 e7 1d 99 f5 bb 7e 24 2e fe 34 e8 d7
SSL_connect:SSLv2/v3 write client hello A
read from 080ACFE0 [080B2AD0] (7 bytes => 0 (0x0))
18357:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:226:
Run Code Online (Sandbox Code Playgroud)
最后,如果我将 openssl 设置为在服务器端提供服务并从客户端主机连接,则它可以正常工作:
openssl s_client -connect <HOSTNAME>:4433 -state -msg -showcerts -debug
Run Code Online (Sandbox Code Playgroud)
你知道为什么 postgres 对我的证书犹豫不决吗?对于我当前的设置,服务器是运行 postgres 8.1 的 FreeBSD 4.7,客户端是运行 postgres 9.0 的 CentOS 4。不确定这是否是这里的因素......
PostgreSQL 不会开始 SSL 协商,除非您发送了一个数据包来指示它这样做。s_client 希望它在该数据包之前执行 SSL。有关 SSL 如何在 PostgreSQL 中工作的文档,请参阅http://www.postgresql.org/docs/9.0/static/protocol-flow.html#AEN84524。
仔细检查您的根证书是否位于客户端上的正确位置,并且 postgres 可以正确读取它。也许到了运行 strace 以确保它确实被读取的程度。这是迄今为止无法正常工作的最常见原因。
正如之前所指出的,您应该尽快退出 8.1,因为它已经结束了。但对此应该没有太大影响。
| 归档时间: |
|
| 查看次数: |
7284 次 |
| 最近记录: |