栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java调用ssl异常(javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or ci

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java调用ssl异常(javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or ci

今天项目中做了一个微信退款接口,当请求微信退款接口时,报了一个错误:
“javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)”

在本地测试是不会报错的,但是发布到测试环境退款就报这个错误,在网上找了很多解决方案,都是如以下的解决方案:

今天做升级用了jdk1.8发现java调用SSL的时候,突然一下抛出一个异常

经过一阵瞎搞,最后才发现是因为jdk1.8版本导致SSL调用权限上有问题。

解决办法:找到jdk 1.8安装目录,找到C:Program FilesJavajre里面的libsecurity 下面有个java.security。找到对应的SSLv3,删除掉,重启项目就好了。(删掉SSLv3就是允许SSL调用)

但按照这种方式操作以后没有效果,根据个人摸索和认知进行排查并且修复了这个问题。

上面这个报错从百度翻译为: javax。网ssl。SSLHandshakeException:没有合适的协议(协议被禁用或密码套件不合适)

而我原有的代码如下:

这里我们主要这行代码 new String[]{“TLSv1”},解决报错问题和这里有关

	public static CloseableHttpClient createSSLClientCert(InputStream certPath,String password) {
		try {
			KeyStore keyStore = KeyStore.getInstance("PKCS12");
			keyStore.load(certPath,password.toCharArray());
			certPath.close();
			SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
				//信任所有
				public boolean isTrusted(X509Certificate[] chain,
										 String authType) throws CertificateException {
					return true;
				}
			}).loadKeyMaterial(keyStore, password.toCharArray()).build();
			SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,new String[]{"TLSv1"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
			return HttpClients.custom().setSSLSocketFactory(sslsf).build();
		} catch (KeyManagementException e) {
			log.error("", e);
		} catch (NoSuchAlgorithmException e) {
			log.error("", e);
		} catch (KeyStoreException e) {
			log.error("", e);
		}catch (FileNotFoundException e){
			log.error("", e);
		}catch (Exception e){
			log.error("", e);
		}
		return HttpClients.createDefault();
	}

根据 SSLConnectionSocketFactory 的构造方法可以知道,二个参数可以设置加密算法,项目之前是指定了只支持 new String[]{“TLSv1”} 一种算法,但是服务器上支持的是 TLSv1.2 的算法,导致算法不匹配而报错。

所以有以下两种算法:

  • 增加支持的加密算法,比如 new String[]{"TLSv1","TLSv1.2"},我用的就是这种
  • 把第二个参数设为 null 不开启加密
但是为了安全考虑,使用第二种方式还是需要慎重考虑的。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931180.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号