使用CA证书连接DigitalOcean MySQL时Java应用连接失败求助
问题描述
尝试使用CA证书连接受SSL保护的MySQL数据库时,通过MySQL Workbench按如下配置可正常连接:
但Java应用连接时失败,使用的JDBC连接字符串如下:
jdbc:mysql://[user]:[pass]@[host]:[port]/[database]?useSSL=true&sslMode=VERIFY_CA&trustCertificateKeyStoreUrl=file:[absolute-path-to-crt-file]
核心报错信息如下:
Caused by: java.io.IOException: Invalid keystore format at java.base/sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:667) at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:222) at java.base/java.security.KeyStore.load(KeyStore.java:1479) at com.mysql.cj.protocol.ExportControlled.getSSLContext(ExportControlled.java:518)
根因分析
报错核心为密钥库格式无效,原因如下:trustCertificateKeyStoreUrl参数要求传入Java标准密钥库(JKS/PKCS12格式)的路径,配置中直接传入了PEM格式的CRT证书文件,格式不兼容导致加载失败。MySQL Workbench原生支持读取PEM格式证书,所以连接正常。
解决方案
提供两种适配方案:
方案1:直接读取CRT文件(推荐,无需转换格式,适配Connector/J 8.0及以上版本)
直接替换JDBC连接串中的证书参数即可,无需额外转换证书:
jdbc:mysql://[host]:[port]/[database]?useSSL=true&sslMode=VERIFY_CA&serverSslCert=file:[CRT文件绝对路径]&user=[数据库用户名]&password=[数据库密码]
注:原连接串将用户名密码写在主机位置的写法不符合JDBC规范,建议通过
user、password参数单独配置,或者调用DriverManager.getConnection时作为入参传入。
方案2:将CRT证书转换为JKS格式信任库(兼容所有Connector/J版本)
- 执行JDK自带的keytool命令生成信任库:
keytool -importcert -alias mysql-ca -file [CRT文件绝对路径] -keystore [生成的truststore.jks存放路径] -storepass [自定义信任库密码]
执行后提示是否信任证书时输入yes回车,即可生成JKS格式的信任库文件。
2. 修改JDBC连接串:
jdbc:mysql://[host]:[port]/[database]?useSSL=true&sslMode=VERIFY_CA&trustCertificateKeyStoreUrl=file:[truststore.jks绝对路径]&trustCertificateKeyStorePassword=[你设置的信任库密码]&user=[数据库用户名]&password=[数据库密码]
注意事项
- 确保证书/信任库文件路径正确,Java运行进程对文件有可读权限
- 若使用Connector/J 5.x版本,需将
sslMode=VERIFY_CA参数替换为verifyServerCertificate=true - 连接前可先确认证书未过期,数据库主机名和证书中绑定的域名/IP一致
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

