You need to enable JavaScript to run this app. 使用Tokio+Deadpool+rustls无法建立PostgreSQL TLS加密连接如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

使用Tokio+Deadpool+rustls无法建立PostgreSQL TLS加密连接如何解决?

问题解决办法

核心问题根因

  • 你的调试日志显示db_ca_cert: None,代码会命中else分支使用NoTls发起非加密连接,但你的PostgreSQL服务端已强制开启TLS,会直接拒绝非加密请求,这是数据库日志报SSL连接失败的直接原因。
  • 你将CA证书路径错误填写到了pg配置的options字段中,tokio-postgres不会从该字段读取sslrootcert配置,导致你写的TLS证书加载分支从未触发。
  • 你未显式配置ssl_mode参数,默认的ssl_mode逻辑会优先尝试非加密连接,且fallback到TLS逻辑时会尝试读取系统默认根证书,找不到就会抛出客户端的No such file or directory报错。

修复步骤

  1. 修正参数传入逻辑,给db_ca_cert参数传入正确的CA证书本地路径,触发代码中的TLS配置分支。
  2. 移除pg配置options字段中的sslrootcert配置项,你的代码已经实现了手动读取加载CA证书到rustls根信任库的逻辑,不需要额外在options中配置。
  3. 显式设置pg配置的ssl_mode为Require(测试环境可用)或VerifyCa(生产环境推荐,强制校验服务端证书合法性),避免客户端优先尝试非加密连接。
  4. 如果你不需要自定义rustls配置,也可以直接通过tokio-postgres原生配置项实现TLS连接,无需手动加载证书,示例代码如下:
let mut pg_config = Config::new();
pg_config
    .user("postgres")
    .password("postgres")
    .dbname("postgres")
    .host("127.0.0.1")
    .port(6432)
    .ssl_mode(SslMode::VerifyCa)
    .ssl_root_cert("/path/to/your/ca.pem");
let pool = pg_config.create_pool(tls)?;

内容的提问来源于stack exchange,提问作者ZPascal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 00:15:02