目录

  • 1. 直接更改微信支付提供的代码(推荐)
  • 2. 查找匹配的 JDK/jre 环境
  • 3. 直接修改 jre 中 java.security 的默认限制

提供给正在弄微信支付踩坑的你,赶快弄完去干其他重要的事情!!!

测微信支付然后退款,出现这种问题是不是觉着很神奇,代码也没动,啥也没改为啥就出现问题了。线上也好好的,本地一测试就报出了下面的错误:

[ERROR][11:42:56] WechatRefundHelper:161 No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
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:98)at sun.security.ssl.TransportContext.kickstart(TransportContext.java:220)at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:428)at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:395)at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:354)at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:134)at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)

出现这个问题的原因其实是 微信支付系统JDKjre 的不兼容,解决方式也主要针对于这两个方面,遇到的时候可以都尝试一下。建议先尝试修改代码,不行的话去查找对应的环境,真不行的话最后去修改 JDK 目录

1. 直接更改微信支付提供的代码(推荐)

这里就还是需要吐槽一下,这代码是不是好久没有更新了,哈哈哈!!!
官方 SDK 地址: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1

// 官方提供的坑代码
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,// 问题就出在下面这句话,直接改为 nullnew String[]{"TLSv1"},null,new DefaultHostnameVerifier());connManager = new BasicHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create().register("http",PlainConnectionSocketFactory.getSocketFactory()).register("https", sslConnectionSocketFactory).build(), null, null, null
);

修改后如下:

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,null,null,new DefaultHostnameVerifier());connManager = new BasicHttpClientConnectionManager(RegistryBuilder.<ConnectionSocketFactory>create().register("http",PlainConnectionSocketFactory.getSocketFactory()).register("https", sslConnectionSocketFactory).build(), null, null, null
);

【注】如果这种方式可以的话就强烈建议这种方式,不行的话就继续往下看。。。

2. 查找匹配的 JDK/jre 环境

如果是一上来开发就遇到还真的不好排查,但是我遇到的是线上没有问题,本地出现了这种问题,刚开始以为还是代码出现了 bug 后来发现,其实就是 JDK/jre 的问题。线上使用的是 OpenJDK,版本如下:

openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (build 25.282-b08, mixed mode)

然而我本地使用的是:

openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)

但是版本差的那么小,应该是没啥问题,但是实际就是有这样的问题,最终也是换到与线上环境版本一致的 JDK 版本然后就没有问题。

这让我想起来之前遇到的也是 JDK 的版本问题: Error:(16, 42) java: package com.sun.org.apache.regexp.internal does not exist

都是泪 !!!

【注】如果是高于 JDK/jre 8 的还是使用先尝试第一种方式。不行的话就往下降低版本,然后结合方法三查找合适的 JDK/jre 版本。

3. 直接修改 jre 中 java.security 的默认限制

其实是不推荐这样改的,如果真到了这一步(第一种和第二种方式都阵亡了),那么就使用这种方式吧。

其实第二种换版本的方式也是为了解决 java.security 的默认限制,方法二示例中这两个 JDK/jrejava.security 配置。

  • 线上 OpenJDK 1.8.0_282java.security
// ....jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \EC keySize < 224, 3DES_EDE_CBC, anon, NULL// ....
  • 本地 OpenJDK 1.8.0_292java.security
// ....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// ....

【注】jdk.tls.disabledAlgorithmstls 的禁用策略。注释中也明确说明了:Disabled algorithms will not be negotiated for SSL/TLS connections, even if they are enabled explicitly in an application. (禁用的算法将不会为SSL/TLS连接进行协商,即使它们在应用程序中显式地启用)。

解决方法:

方法也不麻烦,先找到 JDK/jre 的位置(因为 Java 项目运行的时候使用的是 jre ,只有在开发和编译的时候才会使用 JDK。这里要注意下,因为 JDK 是包含 jre 的,线上改的时候可以只改 jre 目录即可;如果是本地开发,记得也要修改 JDK 中的配置):

# 以 jre 为例:# 查找 java 命令的位置,一般 java 应该在 jre/bin 目录下;有的环境也有可能被设置为一个链接
which java
/usr/local/openjdk-8/bin/java# 根据实际路径处理, jre 的位置一般在 JAVA_HOME 目录下(我这里的是 /usr/local/openjdk-8 )# 进入 java.security 所在的目录
cd /usr/local/openjdk-8/jre/lib/security# 接下来修改 java.security 即可,主要是修改 jdk.tls.disabledAlgorithms,对于微信的退款来说
# 将 TLSv1 从里面删掉即可,这样的话就可以使用了。
vim java.security

【注】其实这个方式还是有点坑的,就是使用的自定义修改后的 JDK/jre 环境,对于协同开发来说做不到很好的统一,所以不是很推荐,建议还是查找合适的 JDK/jre 处理。

个人博客:Roc’s Blog

微信退款 No appropriate protocol (protocol is disabled or cipher suites are inappropriate)相关推荐

  1. 微信退款No appropriate protocol (protocol is disabled or cipher suites are inappropriate)问题解决

    昨天下午测试突然提示说,退款报错了. 项目环境:OpenJDK11. 我查看了下日志,提示:No appropriate protocol (protocol is disabled or ciphe ...

  2. 项目启动报错No appropriate protocol (protocol is disabled or cipher suites are inappropriate) 解决办法

    错误描述: 项目启动报错 Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is di ...

  3. java 发送邮件No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

    采用SSL进行发送邮件, properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocket ...

  4. No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

    记一次问题: 报错: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cip ...

  5. https 请求是报错No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

    No appropriate protocol (protocol is disabled or cipher suites are inappropriate) 解决方案: 修改JDK /usr/j ...

  6. 今天新拉取得项目启动报错:No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

    今天新拉取得项目启动报错 Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is di ...

  7. 微信退款出现No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

    出现这个问题是微信支付系统 和 JDK 或 jre 的不兼容,可以先修改代码然后,如果还是不行.再修改jdk. 修改调用微信接口的代码 // 把"TLSv1"修改为null. 修改 ...

  8. 微信支付 No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

  9. idea2022报错: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

    这个问题是由于访问https访问不了,而http可以访问 搜索参考其他人的解决方案,报错依旧无法解决 突然想到是重新下的idea2022,想到了jdk(由于下载idea时版本要与jdk版本对应,否则无 ...

最新文章

  1. 刚刚,三名中国航天员奔赴太空!其中一位刚参加完博士毕业典礼!
  2. Python调用MySQL模块初试
  3. NODE-WEBKIT教程(12)全屏
  4. View工作原理(四)view的layout过程
  5. android 非法字符 \ufeff错误
  6. springboot 日志数据
  7. 检测Product 被其他business transaction 引用的小程序
  8. java直接选择排序_Java排序大法-直接选择排序
  9. (96)自动售货机状态转移图,面试必问(二十)(第20天)
  10. CString Format 乱码问题
  11. JS中获取地址栏中的参数
  12. 二分搜索:lower_bound 与 upper_bound 函数
  13. 【已解决】Failed to start cron.service: Unit cron.service not found.
  14. monkey命令总结
  15. Windows7旗舰版SP1_64位2018.10(纯净版)
  16. 关于严格模式的简单介绍
  17. idea html设置字体大小,intellij idea设置(字体大小、背景)
  18. 基于cnn的人脸识别_鬼都藏不住,人脸识别新突破!就算遮住半张脸也能100%被识别...
  19. Adnroid ViewPage 使用
  20. 团队-中国象棋游戏-模块测试过程

热门文章

  1. CocosCreator - Bezier曲线插件
  2. 关于Unity打apk包安装到有虚拟按键的android机画布被压扁解决方案
  3. mysql冻结某一列_jQuery 实现冻结表格行和列
  4. OpenGL ES圆内放大、缩小、向某一点拉伸(曲线形变)算法
  5. laravel5.8 php版本7.0和7.1
  6. 游戏的世界World
  7. android sim 卡短信读写
  8. Windows系统下创建苹果证书
  9. Rxjava+Retrofit2+Okhttp3多文件上传(服务器端代码+客户端代码)
  10. Python入门-基础篇笔记02