MySQL连接报错No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

博客围绕Java连接MySQL在本地正常、容器部署后失败的问题展开。报错显示连接协议被禁用或密码不对,经排查用户名、密码和网络均正常,怀疑是JDK版本问题,因JDK 1.8高版本对SSL协议有限制。给出三种解决方案,如降低JDK版本、修改配置文件、禁用SSL。
该文章已生成可运行项目,

背景

本地连接没问题,容器部署后连接失败。

  • MySQL版本:5.7.22
  • JDK版本:1.8.0_312

现象

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

这个报错的意思是说连接协议被禁用或密码不对。

排查过程

  1. 排查用户名密码是否正确——正确
  2. 排查网络是否通畅——通畅
  3. 我本地使用的是jdk1.8.0_172,打镜像时,基础镜像里的jdk版本是1.8.0_312。怀疑是不是jdk版本导致。通过在网上的搜索发现,jdk1.8的高版本确实对SSL协议做了限制

解决方案

此处给出三种解决方案:

  1. 降低基础镜像的jdk版本,改为与本地一致的1.8.0_131。

  2. 修改jdk的配置文件,去除对ssl协议的限制,可以参考《Java调用ssl异常,javax.net.ssl.SSLHandshakeException: No appropriate protocol》

  3. 最简单的方法,直接在连接MySQL时,连接参数里禁用SSL:

    useSSL=false

本文章已经生成可运行项目
### SQL Server 连接报错 'No appropriate protocol (protocol is disabled or cipher suites are inappropriate)' 的解决方案 当遇到此错误时,通常是因为客户端和服务器之间的TLS/SSL协议版本或加密套件不兼容。以下是几种可能的解决方案: #### 方法一:调整JDBC驱动程序的安全参数 对于SQL Server JDBC连接字符串中的安全设置可以进行相应更改来解决问题。可以在应用程序的连接URL中加入特定参数以禁用SSL验证或将SSL模式设为`Disable`。 ```java jdbc:sqlserver://localhost:1433;databaseName=YourDatabase;encrypt=true;trustServerCertificate=true; ``` 如果不需要启用加密,则可以直接关闭它: ```java jdbc:sqlserver://localhost:1433;databaseName=YourDatabase;encrypt=false; ``` 这种方法适用于那些确实没有必要使用加密传输的应用场景[^3]。 #### 方法二:更新Java环境下的JSSE配置文件 由于OpenJDK和其他基于Java的技术栈可能会因为安全性增强而屏蔽掉某些旧版TLS协议或者弱密码算法,在这种情况下可以通过编辑`$JAVA_HOME/jre/lib/security/java.security` 文件内的相关条目来进行修复。具体来说就是确保启用了合适的TLS版本以及强健的密钥交换机制。 例如,允许最低限度支持到TLSv1.2及以上版本,并移除任何过期或被认为不够强壮的cipher suite定义[^2]: ```properties # Enable TLS protocols from version 1.2 upwards. jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1 ``` #### 方法三:升级SQL Server 和 Java 版本 考虑到长期维护和支持的角度出发,建议定期检查并考虑将所使用的SQL Server实例及其对应的JDBC驱动器都保持最新状态;同样也应关注运行环境中Java平台本身的迭代情况。较新的软件版本往往包含了更多针对现代网络安全标准的支持特性,从而减少此类问题的发生几率[^1]. 通过上述三种方式之一应该能够有效处理"No appropriate protocol (protocol is disabled or cipher suites are inappropriate)" 错误信息带来的困扰。
在使用 Netty 框架实现 TLCP(Transport Layer Cryptographic Protocol,即国密协议)通信时,若出现 `No appropriate protocol (protocol is disabled or cipher suites are inappropriate)` 错误,通常表示客户端与服务端在 TLS 握手阶段未能协商出一致的协议版本或加密套件。这一问题在基于 Netty 的安全通信中较为常见,尤其是在使用国产加密协议(如 TLCP)时,需特别注意协议版本、加密套件以及 JDK 或 Bouncy Castle 等底层安全提供者的支持情况。 ### 配置 TLCP 协议版本 Netty 本身基于 JDK 的 SSL/TLS 实现(如 `SSLEngine`),因此 TLCP 协议的启用依赖于所使用的 JDK 是否支持该协议。部分国产 JDK(如龙芯 JDK 或基于 Bouncy Castle 的定制 JDK)可能需要显式启用 TLCP 协议。 - **在 Netty 中启用 TLCP 示例:** ```java SslContext sslContext = SslContextBuilder.forClient() .sslProvider(OpenSsl.isAvailable() ? SslProvider.OPENSSL : SslProvider.JDK) .protocols("TLCPv1.1") // 显式指定启用 TLCP 协议 .build(); ``` 若 JDK 不支持 TLCP,需确保已安装支持国密算法的 Bouncy Castle 提供者,并在 JVM 启动参数中添加: ```bash -Djavax.net.ssl.trustStoreType=BC -Djavax.net.ssl.keyStoreType=BC -Dorg.bouncycastle.jsse.provider=BouncyCastleJsseProvider ``` ### 配置 CipherSuite 支持 TLCP 协议使用的加密套件与标准 TLS 不同,常见的国密 CipherSuite 包括 `ECC_SM4_CBC_SM3`、`ECDHE_SM4_CBC_SM3` 等。在 Netty 中,需确保客户端与服务端均启用相同的加密套件。 - **在 Netty 中设置 CipherSuite 示例:** ```java SslContext sslContext = SslContextBuilder.forClient() .sslProvider(SslProvider.JDK) .ciphers(Arrays.asList("ECC_SM4_CBC_SM3", "ECDHE_SM4_CBC_SM3")) // 设置国密 CipherSuite .build(); ``` 若使用 Bouncy Castle 提供者,还需在代码中注册: ```java Security.addProvider(new BouncyCastleProvider()); ``` ### 检查 Netty 的 SSLProvider 支持 Netty 支持多种 SSLProvider,包括 `JDK` 和 `OPENSSL`。在启用 TLCP 时,推荐使用 `JDK` 模式,并确保所用 JDK 支持国密算法。 - **检查 Netty 是否启用 OPENSSL:** ```java if (OpenSsl.isAvailable()) { logger.info("OpenSSL is available"); } else { logger.warn("OpenSSL is not available, falling back to JDK SSL"); } ``` 若 OpenSSL 不支持 TLCP,应强制使用 JDK 模式以避免协议协商失败。 ### 日志与调试工具 为了诊断握手失败的具体原因,可在 Netty 中开启 SSL 日志: - **启用 Netty 的 SSL 日志:** ```java System.setProperty("javax.net.debug", "ssl:handshake"); ``` 同时,可使用 `openssl s_client` 工具连接服务端并查看握手细节: ```bash openssl s_client -connect localhost:8443 -tlcp ``` 若服务端未正确配置 TLCP 协议或 CipherSuite,会返回 `no shared cipher` 或 `protocol version not supported` 等错误。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值