**问题描述(198字):**
使用DBeaver连接阿里云RDS(MySQL/PostgreSQL)时,常因SSL握手失败报错“PKIX path building failed”或“Received fatal alert: handshake_failure”。根本原因在于:阿里云RDS强制要求SSL连接,但DBeaver默认未配置可信CA证书,且JDK版本过高(如JDK 17+)可能禁用TLS 1.0/1.1,而部分RDS实例(尤其旧版)仅支持TLS 1.2且依赖阿里云根证书链。此外,DBeaver连接参数中`useSSL=true`(MySQL)或`sslmode=require`(PG)启用后,若未同步导入`rds-ca-2019.pem`(或新版`rds-combined-ca-bundle.pem`)至Java信任库或DBeaver SSL设置,即触发握手中断。用户误设`allowPublicKeyRetrieval=true`或忽略证书验证选项,亦会导致兼容性异常。该问题高频出现在Windows/macOS本地DBeaver客户端,与RDS白名单、网络策略无直接关联。
1条回答 默认 最新
程昱森 2026-02-26 23:50关注```html一、现象层:典型错误日志与复现场景
- MySQL连接报错:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException - PostgreSQL连接报错:
Received fatal alert: handshake_failure - 高频复现场景:Windows/macOS本地DBeaver 23.3+ + JDK 17/21 + 阿里云RDS MySQL 5.7/8.0 或 PostgreSQL 12/14
- 网络可达性验证通过(
telnet rds-host 3306或nc -zv rds-host 5432成功),排除白名单与VPC策略干扰
二、协议层:TLS握手失败的深层技术动因
阿里云RDS自2021年起强制启用SSL/TLS加密,但其证书链依赖专属CA体系:
组件 默认行为 RDS兼容要求 JDK 17+ 默认禁用TLS 1.0/1.1;仅启用TLS 1.2/1.3 旧版RDS实例(如MySQL 5.6)仅支持TLS 1.2且需完整阿里云根证书链 DBeaver JDBC驱动 MySQL Connector/J 8.0.33+ 默认校验证书链完整性 若未显式加载 rds-combined-ca-bundle.pem,则无法构建信任路径三、配置层:DBeaver连接参数的精确语义解析
关键参数非布尔开关,而是具有严格TLS协商语义:
useSSL=true(MySQL)≠ 启用SSL,而是触发“SSL握手+证书验证”全流程sslmode=require(PostgreSQL)不跳过证书校验,必须完成CA链验证allowPublicKeyRetrieval=true是危险降级选项,仅适用于MySQL 8.0早期认证插件缺陷,与RDS证书问题无因果关系- 正确做法:关闭该参数,转而导入可信CA证书
四、证书层:阿里云CA证书演进与适配策略
阿里云已发布两代CA证书包,需按RDS创建时间精准选用:
graph LR A[RDS创建时间] -->|2019年前| B[rds-ca-2019.pem] A -->|2019年及以后| C[rds-combined-ca-bundle.pem] B --> D[单根证书,SHA-256] C --> E[多证书合并包,含G5/G6根证书] D & E --> F[必须导入JVM truststore或DBeaver SSL设置]五、实施层:双路径解决方案(推荐生产环境使用)
- 路径一(推荐):配置DBeaver独立SSL信任库
在连接编辑器 → SSL 标签页 → 勾选Use custom SSL configuration→ 指定rds-combined-ca-bundle.pem路径 - 路径二(全局生效):扩展JVM信任库
keytool -import -alias aliyun-rds -file rds-combined-ca-bundle.pem -keystore $JAVA_HOME/lib/security/cacerts - 验证命令:
keytool -list -v -keystore $JAVA_HOME/lib/security/cacerts | grep aliyun - 重启DBeaver使JVM信任库变更生效
六、验证层:端到端连通性诊断清单
- ✅ 检查DBeaver所用JDK版本:
Help → About → Installation Details → JVM - ✅ 确认RDS实例SSL设置:
控制台 → RDS实例 → 参数设置 → require_secure_transport = ON - ✅ 抓包验证TLS协商:
tshark -i any -f "host rds-host and port 3306" -Y ssl.handshake - ✅ 日志增强:在DBeaver启动脚本中添加
-vmargs -Djavax.net.debug=ssl:handshake
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- MySQL连接报错: