版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/fsafs168/article/details/82020959 我报了这个异常,传说这个异常的原因多种多样,一般情况下是因为jdk的BUG导致。相关原理可以访问https://stackoverflow.com/questions/6353849/received-fatal-alert-handshake-failure-through-sslhandshakeexception
而我依次使用了以下方法 1. 我是使用的jdk 1.7 ,然后升级到1.8就没有问题 2. 有时候升级没有用,可能是jdk内的jar包版本不对,需要去下载更新: jdk 7 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html jdk 8 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html 3. 还有一个传说,改代码强制使代码使用XX版本即可,我试了下没用,你可以试试: System.setProperty(“https.protocols”, “TLSv1.2,TLSv1.1,SSLv3”); 4. 有的时候是别的原因,你可能需要打开-Djavax.net.debug=all的虚拟机参数去看发生了什么。这个参数我是看不懂…只是找了一些关键字 5. 这个时候你还可以使用https://myssl.com/去查一下你访问的网址支持哪些协议。我发现我的接口只支持TLSv1.2,然后我jdk是7,不能升级。于是写代码和安装jce强制使用: 以下使用httpclient 4.5.6
SSLContext sslContext = SSLContext.getDefault();
SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory( sslContext, new String[]{"TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() .register("https", sslConnectionFactory) .register("http", PlainConnectionSocketFactory.INSTANCE) .build();
HttpClientConnectionManager ccm = new BasicHttpClientConnectionManager(registry);
httpclient = HttpClientBuilder.create(). .setSSLSocketFactory(sslConnectionFactory) .setConnectionManager(ccm) .build();
正常了。其中的关键在于修改sslConnectionFactory。如果你使用其它的jar或者原生程序,只需要设定改写Factory即可。
感谢: https://blog.csdn.net/sun5769675/article/details/81322324 http://ligaosong.iteye.com/blog/2356346 https://stackoverflow.com/questions/6353849/received-fatal-alert-handshake-failure-through-sslhandshakeexception ———————————————— 版权声明:本文为博主「fsafs168」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/fsafs168/article/details/82020959