在DigitalOcean托管MySQL通过TLS加密连接时,ca-certificate.crt应放何处?
解决DigitalOcean托管MySQL的SSL/TLS证书配置问题
环境背景
在macOS Ventura系统的IntelliJ 2023.1中,使用Java 20 + JDBC 4.2+,通过com.mysql.cj.jdbc.MysqlDataSource构建Demo应用,连接DigitalOcean托管的MySQL实例。该实例要求启用SSL(实际为TLS),已下载官方提供的ca-certificate.crt证书文件,但不清楚如何配置到数据源中。
三种证书配置方案
方案1:直接指定证书文件路径(开发环境首选)
通过MysqlDataSource的setSslCa()方法直接传入证书文件的绝对路径,无需修改系统信任库,适合快速调试。
方案2:导入证书到Java信任库(生产环境推荐)
将证书导入JRE的全局信任库,让Java默认信任该证书:
- 打开终端,执行命令(替换路径为你的实际文件路径):
keytool -importcert -file /path/to/ca-certificate.crt -alias digitalocean-mysql -keystore /Library/Java/JavaVirtualMachines/jdk-20.jdk/Contents/Home/lib/security/cacerts
- 信任库默认密码为
changeit,输入密码完成导入。 - 配置数据源时无需额外指定证书路径,Java会自动从信任库读取。
方案3:通过JDBC URL参数配置
在JDBC URL中添加sslCa参数直接指定证书路径:
ds.setURL("jdbc:mysql://db-mysql-nyc1-whatever.db.ondigitalocean.com:25000/defaultdb?sslCa=/path/to/ca-certificate.crt");
修改后的完整数据源配置代码
以方案1为例,代码如下:
private DataSource fetchDataSource() { MysqlDataSource ds = null; try { ds = new MysqlDataSource(); // Server配置 ds.setURL("jdbc:mysql://db-mysql-nyc1-whatever.db.ondigitalocean.com:25000/defaultdb"); ds.setRequireSSL(true); // 指定CA证书文件路径(替换为你的实际路径) ds.setSslCa("/Users/yourname/Downloads/ca-certificate.crt"); // 用户认证 ds.setUser("doadmin"); ds.setPassword("tiger"); return ds; } catch (SQLException e) { e.printStackTrace(); } throw new IllegalStateException("Failed to establish a JDBC DataSource. Msg # 3dfbbc6a-41d4-455d-9b6c-addf433522e5."); }
注意事项
- 确保证书文件路径正确且具备可读权限
- 若使用方案2,导入证书后需重启IntelliJ或应用,确保JVM加载更新后的信任库
- MySQL Connector/J 8.0+默认启用TLS 1.2+,无需额外配置协议版本
内容的提问来源于stack exchange,提问作者Basil Bourque
相关产品推荐
相关产品推荐

