You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CA证书连接DigitalOcean MySQL时Java应用连接失败求助

问题描述

尝试使用CA证书连接受SSL保护的MySQL数据库时,通过MySQL Workbench按如下配置可正常连接:
MySQL Workbench SSL配置
但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版本)

  1. 执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:48:03