前言

今天在新的服务器上搭建 Java 环境,从 Oracle 官网上下载了最新的 jdk 版本 1.8.0_311,然后上传到服务器 jar 包,启动 jar 包,这些常规操作。本以为这个项目搭建就此结束,但是当测试提现功能时,服务器突然报错:No appropriate protocol (protocol is disabled or cipher suites are inappropr

解决

首先排查了下微信商户号、支付参数等是否有误,但若参数有误的话微信会直接返回相应错误,所以不是该问题。

然后将思路转移到是否是环境问题,则确认了一下之前的服务器上的 jdk 版本和当前服务器 jdk 版本是否一致,因为下载的是最新的,所以已经不一致了

可以提现的服务器 jdk 版本是 212

当前服务器 jdk 版本是 311

经翻阅互联网文章发现 Java8-291 之后 , 禁用了 TLS1.1, 而我们安装的是 java8-311。并且该禁用该参数会导致微信提现报错,所以我们需要放开该限制。

修改 java.security 文件

首先找到安装 java 的目录,如果忘记可以通过环境变量中配置的查看
环境变量文件在 etc/profile
我的环境变量文件如下:

1
2
3
4
5
# Java
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre

所以我的目录是

1
vim /usr/local/java/jre/lib/security/java.security

然后搜索 jdk.tls.disabledAlgorithms=
可找到:

1
2
3
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, 变成如下:

1
2
3
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves

然后保存文件,在重启 jar 包,在测试提现就可以提现到账了。

参考文章:
(31条消息) 微信退款 No appropriate protocol (protocol is disabled or cipher suites are inappropr)_YLIHMS的博客-CSDN博客
(31条消息) Java8(291)之后 , 禁用了TLS1.1 , 使JDBC无法用SSL连接SqlServer2008怎么办,以下是解决办法_kfepiza的博客-CSDN博客