No appropriate protocol (protocol is disabled or cipher suites are inappropriate)(Java版)

问题

在访问MySQL时出现了,如下错误:

javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

The following required algorithms might be disabled: SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, include jdk.disabled.namedCurves. Edit the list of disabled algorithms to include required algorithms. You can try to enable TLSv1 or TLSv1.1 first.

JDBC driver may have disabled TLS 1.1 and its earlier versions.

从这里就可以看出MySQL和客户端连接使用的tls版本,可能是TLSv1或者是TLSv1.1,需要放开jdk对TLSv1或者是TLSv1.1黑名单的限制。随便去掉一个TLSv1或者是TLSv1.1即可重现链接。

原因

查询JDK对TLS版本的黑名单限制:
vim /Library/Java/JavaVirtualMachines/jdk1.8.0_311.jdk/Contents/Home/jre/lib/security/java.security
tls限制
从这里就可以看出本地的JDK对TLSv1,TLSv1.1,有限制,具体配置如下:

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

查询MySQL5.7版本文档,可以知道,MySQL支持TLSv1, TLSv1.1, TLSv1.2 版本。
MySql5.7
连接我的DataGrip的时候可以只使用了TLSv1, TLSv1.1,而不会使用 TLSv1.2 进行连接建立。
使用命令行登录MySQL,可以查询MySQL实例支持的TLS版本,以及当前连接使用的TLS版本。
mysqlcli连接
mysql实例支持的TLS版本:

SHOW GLOBAL VARIABLES LIKE 'tls_version';

mysql当前session的使用的TLS版本:

SELECT * FROM performance_schema.session_status
       WHERE VARIABLE_NAME IN ('Ssl_version','Ssl_cipher');

解决

方法1:jdk.tls.disabledAlgorithms接触限制

去掉TLSv1
去掉TLSv1.1的黑名单即可,即使用如下环境变量:
"-Djdk.tls.disabledAlgorithms=SSLv3, TLSv1, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, include jdk.disabled.namedCurves"

方法2:JDBC指定TLS连接版本

jdbc:mysql://:/?useSSL=true&enabledTLSProtocols=TLSv1.2

总结

尽可能用高版本的MySQL或指定session使用的tls版本为tlsv1.2即可。

参考:

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值