为何AWS RDS PostgreSQL过期CA证书仍可建立SSL连接?
问题:过期CA证书下AWS RDS PostgreSQL仍能建立SSL连接的原因
我发现AWS RDS上的CA证书已于2024年8月22日过期,但仍能通过psql和DBeaver建立新连接,且pg_stat_ssl显示连接为SSL启用状态。该RDS的参数组设置了rds.force_ssl=1和ssl=1,为何过期CA证书下仍能建立SSL连接?
查询语句及结果:
select s.*, query from pg_stat_ssl s inner join pg_stat_activity a using(pid) where usename<>'rdsadmin' and application_name='psql'; pid | ssl | version | cipher | bits | client_dn | client_serial | issuer_dn | query ------+-----+---------+-----------------------------+------+-----------+---------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------- 3075 | t | TLSv1.2 | ECDHE-RSA-AES256-GCM-SHA384 | 256 | | | | select s.*, query from pg_stat_ssl s inner join pg_stat_activity a using(pid) where usename<>'rdsadmin' and application_name='psql';
(1 row)
核心原因分析
1. 客户端未启用CA证书有效性验证
psql和DBeaver默认的SSL连接模式不会校验CA证书的有效期:
- psql默认仅指定
ssl=on时,实际对应sslmode=require模式——该模式只强制建立SSL加密连接,但不会验证服务端CA证书的真实性、有效期。只有设置sslmode=verify-ca(验证CA可信)或sslmode=verify-full(验证CA+域名匹配)时,才会检查CA证书是否过期。 - DBeaver如果未在连接配置中开启「验证服务器证书」选项,同样会跳过CA证书的有效性校验,仅保证连接加密。
2. RDS服务端可能已自动轮换有效证书
AWS RDS默认会自动更新CA证书(除非手动关闭自动更新)。你本地保存的CA证书文件过期,不代表RDS实例当前使用的证书过期。可通过以下方式确认:
- 登录AWS控制台,查看RDS实例「配置详情」中的CA证书版本及有效期;
- 用命令行直接获取服务端证书信息:
输出的openssl s_client -connect your-rds-endpoint:5432 < /dev/null 2>/dev/null | openssl x509 -noout -datesnotBefore和notAfter会显示服务端证书的实际有效期。
3. RDS参数组仅强制SSL连接,不控制CA验证
rds.force_ssl=1和ssl=1的作用是强制客户端必须使用SSL连接,拒绝非SSL请求,但这两个参数不涉及客户端对服务端CA证书的验证逻辑——CA验证是客户端侧的配置行为,服务端无法干预。
验证与修复建议
开启客户端严格CA验证:
- psql连接时指定
sslmode=verify-full并提供有效CA证书:
此时如果CA证书过期,连接会直接失败。psql "host=your-rds-endport dbname=your-db user=your-user sslmode=verify-full sslrootcert=/path/to/valid/rds-ca.pem" - DBeaver中编辑连接,在「SSL」设置里勾选「验证服务器证书」,并指定最新的RDS CA证书文件。
- psql连接时指定
确认RDS实例CA证书状态:
如果控制台显示实例CA证书已过期,手动触发证书更新(AWS提供无停机更新选项)。
内容的提问来源于stack exchange,提问作者Y Bai
相关产品推荐
相关产品推荐

