You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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的官方连接协议:

  1. 先发送包含SSL支持标识的启动报文
  2. 收到服务器同意启用SSL的响应后,再发起标准SSL握手
  3. 此时服务器会正常返回证书,完成加密连接的建立

另外,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:25:27