解决SpringBoot连接数据库的SSLHandshakeException异常

问题

    在改一个新项目,服务启动时报错了,堆栈信息如下:

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之后,可能还会出现其它异常,需要检查是否导入证书以及其它配置,后续再列。

参考

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

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值