问题
在改一个新项目,服务启动时报错了,堆栈信息如下:
Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
at sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:171)
at sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:106)
at sun.security.ssl.TransportContext.kickstart(TransportContext.java:245)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:410)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:389)
at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:186)
... 118 more
这个错误一般是由SSL/TLS握手过程中客户端和服务器之间支持的协议或密码套件不匹配引起的。
检查了下数据库连接串,配置了useSSL=true,表示要求使用SSL/TLS来加密与MySQL数据库之间的连接。
jdbc:mysql://******:3306/cloud?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=true
解决方案
方案一:调整SSL配置
在连接字符串中,尝试省略 useSSL 参数或使用 useSSL=false,以便使用默认的 SSL/TLS 配置。
如果生产场景强制要求SSL,不建议该方案。
useSSL=false
方案二:指定密码套件(建议)
先确认mysql的ssl配置以及支持的tls版本;
mysql> show VARIABLES like '%ssl%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | server-key.pem |
+---------------+-----------------+
9 rows in set (0.09 sec)
# 确认mysql支持的tls
mysql> SHOW VARIABLES LIKE 'tls_version';
+---------------+-----------------------+
| Variable_name | Value |
+---------------+-----------------------+
| tls_version | TLSv1,TLSv1.1,TLSv1.2 |
+---------------+-----------------------+
1 row in set (0.08 sec)
在连接字符串中配置enabledTLSProtocols=TLSv1.2,指定tls协议。
jdbc:mysql://******:3306/cloud?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=true&enabledTLSProtocols=TLSv1.2
方案三:修改JDK的java.security文件
JAVA_HOME\jre\lib\security\java.security文件中,jdk.tls.disabledAlgorithms配置,禁用特定的一些不安全的算法或协议。
不同JDK版本,禁用的算法和协议存在差别。
JDK8修改前
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
修改后(删除TLSv1, TLSv1.1协议)
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
以上方案,都可以解决最开始SSLHandshakeException的异常,具体方案请根据实际场景采纳。
启用SSL之后,可能还会出现其它异常,需要检查是否导入证书以及其它配置,后续再列。文章来源:https://www.toymoban.com/news/detail-842779.html
参考
Why can Java not connect to MySQL 5.7 after the latest JDK update and how should it be fixed? (ssl.SSLHandshakeException: No appropriate protocol) - Stack Overflow文章来源地址https://www.toymoban.com/news/detail-842779.html
到了这里,关于解决SpringBoot连接数据库的SSLHandshakeException异常的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!