我试图build立我的postgres服务器做ssl连接。 我正确设置了postgresql.conf和pg_hba.conf。 我在postgres数据目录中创build了一个密钥和自签名证书(server.crt和server.key),并将server.crt复制到root.crt。
我还在另一台主机上使用来自服务器的root.crt设置了一个证书和密钥来签署客户机证书。 当我使用openssl来testing证书一切都很好。 但是,当我尝试连接到postgres服务器失败:
psql -h <HOSTNAME> -U <USER> -d <DB> psql: SSL error: certificate verify failed
或者:
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:
最后,如果我设置openssl服务于服务器端,并从客户端主机连接,它工作正常:
openssl s_client -connect <HOSTNAME>:4433 -state -msg -showcerts -debug
任何想法,为什么postgres是在我的证书balking? 对于我目前的设置,服务器是运行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,因为它已经结束了。 但对此应该没有什么大的影响。
删除我的老〜/ .postgresql解决了我的问题。 尝试strace psql来检查open调用。