如何构建SSL证书链修复Rails pg gem的PG::ConnectionBad连接错误
解决Rails pg gem连接Azure Postgres时的SSL连接重置问题
一、先获取更详细的错误信息
当前仅返回Connection reset by peer,无法定位具体原因,可通过以下方式获取细节:
- 开启PG客户端调试日志:在命令行执行
set PGSSLDEBUG=1,再启动rails c,PG会输出SSL握手的完整调试信息,包括证书验证、协议协商过程。 - 提升Rails日志级别:修改
config/environments/production.rb中的config.log_level = :debug,或启动控制台时用rails c --verbose,强制输出连接阶段的详细日志。 - 用原生psql测试:跳过Rails直接测试数据库连接,命令示例:
若psql也报错,可得到更直接的SSL层错误,快速排除Rails框架层面的问题。psql "host=your-azure-postgres.postgres.database.azure.com port=5432 dbname=your_db user=your_user password=your_pass sslmode=require"
二、构建完整信任链证书文件(Windows环境)
Azure Postgres要求客户端信任完整的证书链,步骤如下:
- 下载所需证书:
- 根证书:DigiCert Global Root G2
- 中间证书:DigiCert Global G2 TLS RSA SHA256 2020 CA1
- 合并证书文件:在Windows命令行执行
(将中间证书内容放在前面,根证书在后,确保验证顺序正确)type digicert-intermediate.crt digicert-root.crt > root.crt - 配置database.yml:
production: adapter: postgresql host: your-azure-postgres.postgres.database.azure.com database: your_db username: your_user password: your_pass sslmode: verify-full sslrootcert: "C:/Projects/your-app/root.crt" # 用绝对路径,避免转义问题 ssl_min_protocol_version: TLSv1.2 # 强制使用Azure要求的TLS版本
三、排查Cisco Endpoint Ark的影响
由于问题出现在Cisco配置变更后,需重点检查:
- 确认Cisco Endpoint Ark是否拦截了5432端口的SSL流量,或对Azure Postgres的域名做了SSL中间人拦截,需将该域名加入设备的信任白名单。
- 检查Cisco是否限制了TLS协议版本,确保允许TLS1.2及以上版本(Azure Postgres不支持低于TLS1.2的协议)。
四、旧版Rails(6.0.3.4)适配注意事项
- 确保pg gem版本与Rails兼容,推荐使用pg 1.2.x或1.3.x版本,避免因版本不支持导致的SSL参数失效。
- 旧版pg gem不支持相对路径的
sslrootcert配置,必须使用绝对路径(Windows下用正斜杠或双反斜杠)。
内容的提问来源于stack exchange,提问作者David Krider
相关产品推荐
相关产品推荐

