如何解决WSO2IS-5.7使用MySQL RDS作为后端存储时的unknown_ca错误?
解决AWS RDS与JDBC连接的SSLHandshakeException: unknown_ca问题
我来帮你排查这个SSL握手失败的问题——你遇到的com.mysql.jdbc.exceptions.jdbc4.CommunicationsException根源是javax.net.ssl.SSLHandshakeException: Received fatal alert: unknown_ca,说明JDBC客户端没信任RDS的CA证书。虽然你已经导入了证书,但可能是导入方式、JDBC配置或者驱动版本的问题,咱们一步步来解决:
1. 修正JDBC URL的SSL配置
mysql-connector-java 5.1.x版本默认不会强制SSL,但AWS RDS默认要求SSL连接,你需要在JDBC URL里明确指定SSL相关参数,确保客户端使用正确的信任库:
jdbc:mysql://<instance>.<zone>.rds.amazonaws.com:3306/carbon_db?useSSL=true&requireSSL=true&trustCertificateKeyStoreUrl=file:/path/to/your/client-trustore.jks&trustCertificateKeyStorePassword=your-keystore-password
如果你用的是WSO2,更推荐在deployment.toml的数据源配置中添加这些参数,比如:
[database.datasources] [database.datasources.WSO2_CARBON_DB] url = "jdbc:mysql://<instance>.<zone>.rds.amazonaws.com:3306/carbon_db?useSSL=true&requireSSL=true" driverClassName = "com.mysql.jdbc.Driver" username = "your-username" password = "your-password" pool_options.trustCertificateKeyStoreUrl = "file:${carbon.home}/repository/resources/security/client-trustore.jks" pool_options.trustCertificateKeyStorePassword = "wso2carbon"
2. 正确导入RDS CA证书(拆分bundle文件)
你使用的rds-combined-ca-bundle.pem是包含多个CA证书的集合,但mysql-connector-java 5.1.x的驱动无法直接识别bundle文件,需要拆分后逐个导入:
- 把
rds-combined-ca-bundle.pem拆分成单个证书文件,每个文件包含完整的证书块(从-----BEGIN CERTIFICATE-----到-----END CERTIFICATE-----) - 对每个拆分后的证书执行导入命令(以WSO2默认的client-trustore为例):
keytool -importcert -keystore <WSO2_HOME>/repository/resources/security/client-trustore.jks -storepass wso2carbon -noprompt -alias rds-ca-1 -file rds-ca-1.pem keytool -importcert -keystore <WSO2_HOME>/repository/resources/security/client-trustore.jks -storepass wso2carbon -noprompt -alias rds-ca-2 -file rds-ca-2.pem # 重复此步骤直到所有证书都导入
3. 确认WSO2使用的是正确的信任库
WSO2默认会优先使用自身的client-trustore.jks,而不是系统的cacerts.jks,所以要确保:
- 你导入证书的是
<WSO2_HOME>/repository/resources/security/client-trustore.jks这个文件 - 启动WSO2时没有通过JVM参数覆盖信任库配置,如果需要指定,添加以下参数到启动脚本:
-Djavax.net.ssl.trustStore=<WSO2_HOME>/repository/resources/security/client-trustore.jks -Djavax.net.ssl.trustStorePassword=wso2carbon
4. 验证证书导入与RDS SSL连接
- 用keytool查看信任库中的证书,确认导入成功:
keytool -list -keystore <WSO2_HOME>/repository/resources/security/client-trustore.jks -storepass wso2carbon
- 用openssl测试RDS的SSL连接,确认证书链正常:
openssl s_client -connect <instance>.<zone>.rds.amazonaws.com:3306
检查输出中的证书链是否和你导入的一致。
5. 考虑升级JDBC驱动版本
mysql-connector-java 5.1.45是较老的版本,可能对AWS RDS新的CA证书支持不足,你可以尝试:
- 升级到5.1.x系列的最新版本(比如5.1.49+)
- 或者直接升级到8.0.x版本(注意驱动类名变为
com.mysql.cj.jdbc.Driver,JDBC URL需要添加serverTimezone参数,比如jdbc:mysql://<instance>.<zone>.rds.amazonaws.com:3306/carbon_db?useSSL=true&serverTimezone=UTC)
内容的提问来源于stack exchange,提问作者Gennady A.
相关产品推荐
相关产品推荐

