为何openssl s_client无法获取AWS RDS Postgres证书但psql可建立SSL连接?
AWS RDS Postgres证书查询的矛盾问题解析
问题背景
执行openssl s_client -connect <db_domain_name>:5432 -showcerts时,输出提示无对等证书可用、SSL握手失败;但使用psql连接数据库时,却明确显示已建立SSL连接(加密套件:ECDHE-RSA-AES128-GCM-SHA256)。核心疑问:
- psql如何在服务器未提供证书的情况下建立SSL连接?
- 若服务器实际提供了证书,为何openssl s_client无法获取?
解答
1. openssl s_client失败的根本原因
Postgres的SSL握手流程不遵循标准SSL的直接握手逻辑:
- 标准SSL工具(比如默认的openssl s_client)会直接向端口发起SSL握手请求
- 但Postgres的连接要求客户端先发送Postgres协议的启动报文,告知服务器自己支持SSL;只有收到服务器的同意响应后,才会启动SSL握手流程。
直接用openssl s_client连接5432端口,跳过了Postgres的初始协议协商步骤,服务器不会触发SSL握手,自然不会返回证书,最终导致握手失败。
2. psql能建立SSL连接的原因
psql严格遵循Postgres的官方连接协议:
- 先发送包含SSL支持标识的启动报文
- 收到服务器同意启用SSL的响应后,再发起标准SSL握手
- 此时服务器会正常返回证书,完成加密连接的建立
另外,psql默认的sslmode参数为prefer——优先尝试SSL连接,成功则使用加密套件,失败则降级为非SSL连接。你看到的加密套件提示,说明SSL握手已经成功,服务器确实提供了证书。
3. 正确查看RDS Postgres证书的openssl命令
需要让openssl模拟Postgres的初始协议协商,使用-starttls postgres参数即可:
openssl s_client -connect <db_domain_name>:5432 -starttls postgres -showcerts
这个命令会先发送Postgres的SSL协商报文,触发服务器进入SSL握手流程,就能正常获取并显示服务器证书了。
内容的提问来源于stack exchange,提问作者Lahiru Chandima
相关产品推荐
相关产品推荐

