Java 8连接MySQL 8.0.37 SSL握手失败问题求助
解决MySQL强制SSL连接的SSLHandshakeException问题
一、确认证书导入的有效性
- 检查导入证书类型:必须是MySQL服务器的CA根证书/自签服务器证书,而非客户端证书。执行以下命令验证证书是否存在于Tomcat实际使用的JDK密钥库中:
(替换keytool -list -keystore ${TOMCAT_JAVA_HOME}/jre/lib/security/cacerts -alias mysql-ssl-cert${TOMCAT_JAVA_HOME}为Tomcat启动参数中指定的JDK路径,默认密钥库密码为changeit) - 核对密钥库路径:避免误导入系统默认JDK的cacerts,通过
ps aux | grep tomcat查看Tomcat启动时的JAVA_HOME参数,对应路径下的cacerts才是生效的。
二、修正JDBC连接串配置
根据MySQL JDBC驱动版本调整参数:
- MySQL Connector/J 5.1.x版本:
(直接指定密钥库路径,避免默认配置的不确定性)jdbc:mysql://db-host:3306/db-name?useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:///${TOMCAT_JAVA_HOME}/jre/lib/security/cacerts&trustCertificateKeyStorePassword=changeit - MySQL Connector/J 8.0.x版本:
jdbc:mysql://db-host:3306/db-name?sslMode=VERIFY_CA&trustCertificateKeyStoreUrl=file:///${TOMCAT_JAVA_HOME}/jre/lib/security/cacerts&trustCertificateKeyStorePassword=changeit - 排查冲突配置:检查Tomcat的
context.xml数据源配置、项目配置文件(如application.properties/yaml)中是否存在useSSL=false之类的参数,覆盖了强制SSL的设置。
三、分析SSL调试日志的关键报错
从日志中定位SSLHandshakeException的具体子原因,针对性解决:
- 报错:
unable to find valid certification path to requested target:
说明Java无法信任MySQL服务器的证书。确认导入的证书是完整链(CA签发需导入根CA证书,自签则导入服务器证书),且证书未过期。 - 报错:
No appropriate protocol (protocol is disabled or cipher suites are inappropriate):
Java 8u201默认禁用TLSv1.0/TLSv1.1,若MySQL仅开启旧版本协议,需指定兼容协议:- 在JDBC连接串添加:
enabledTLSProtocols=TLSv1.2 - 或在Tomcat启动参数中添加:
-Djdk.tls.client.protocols=TLSv1.2
- 在JDBC连接串添加:
四、验证MySQL服务器端SSL配置
- 确认MySQL已强制SSL:登录MySQL执行
SHOW VARIABLES LIKE '%ssl%';,确保have_ssl=YES且require_secure_transport=ON。若未开启,修改my.cnf(或my.ini)添加:
重启MySQL服务。require_secure_transport=ON ssl_ca=/path/to/ca.pem ssl_cert=/path/to/server-cert.pem ssl_key=/path/to/server-key.pem - 确认数据库用户要求SSL:执行
SHOW GRANTS FOR 'your-user'@'app-server-ip';,确保权限包含REQUIRE SSL,若没有则执行:GRANT ALL ON your-db.* TO 'your-user'@'app-server-ip' REQUIRE SSL; FLUSH PRIVILEGES;
五、升级MySQL JDBC驱动版本
Java 8u201搭配旧版驱动可能存在兼容性问题,建议升级到:
- MySQL Connector/J 5.1.47及以上版本(适配MySQL 5.x)
- MySQL Connector/J 8.0.19及以上版本(适配MySQL 8.x)
内容的提问来源于stack exchange,提问作者user2338456
相关产品推荐
相关产品推荐

