用httpclient发送https协议请求以及javax.net.ssl.SSLHandshakeException解决办法
2018-01-09 13:51
896 查看
本人在做接口自动化的过程中,遇到了请求第三方https协议请求,在经过了短暂的知识重新学习之后,写完代码执行起来总是遇到一个异常,在用客户端执行请求的时候抛出来的,下面是异常的信息:
查阅了很多资料,大部分都说是因为java本身安全机制引起的,重新去官网下载jar包替换即可。以下是修改方法:
“
因为jdk中jce的安全机制导致报的错,要去oracle官网下载对应的jce包替换jdk中的jce包。
jce所在地址: %JAVA_HOME%\jre\lib\security里的local_policy.jar,US_export_policy.jar
JDK7 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
“
具体异常教程如下:
异常原因及解决方法
在原因的第二种里面,有一个需要校验本身的TLS的版本和服务端版本是否一致,我就是在这里出了问题,导致的这个异常。因为我一直用的默认参数去创建新的套接字对象。下面是我用Charles拦截的请求的header信息:
上面圈起来的地方就是现实的服务器的TLS版本,相应地改掉自己代码的中设置版本的地方即可。
下面是我的代码:大多数参考了网上的教程,自己做了一些修改,大同小异。下面是获取SSLcontext对象的方法,实现了X509TrustManager接口,里面方法不用修改。
下面是创建https协议的client的方法,其中用到了连接池的使用:
还有一个继承httpclient类,重写createDefault()方法来实现请求https的,经过实验,对于一些https协议是没有问题的,但是对于我测试的接口总是通不过,原因大概是没有经过连接池这一步原因导致的(个人判断,尚未印证)。
宣传一下自己的QQ群:群号:340964272。
X509TrustManager
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394) at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353) 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)
查阅了很多资料,大部分都说是因为java本身安全机制引起的,重新去官网下载jar包替换即可。以下是修改方法:
“
因为jdk中jce的安全机制导致报的错,要去oracle官网下载对应的jce包替换jdk中的jce包。
jce所在地址: %JAVA_HOME%\jre\lib\security里的local_policy.jar,US_export_policy.jar
JDK7 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
JDK8 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
“
具体异常教程如下:
异常原因及解决方法
在原因的第二种里面,有一个需要校验本身的TLS的版本和服务端版本是否一致,我就是在这里出了问题,导致的这个异常。因为我一直用的默认参数去创建新的套接字对象。下面是我用Charles拦截的请求的header信息:
上面圈起来的地方就是现实的服务器的TLS版本,相应地改掉自己代码的中设置版本的地方即可。
下面是我的代码:大多数参考了网上的教程,自己做了一些修改,大同小异。下面是获取SSLcontext对象的方法,实现了X509TrustManager接口,里面方法不用修改。
/** * 获取SSL套接字对象 重点重点:设置tls协议的版本 * * @return */ public static SSLContext createIgnoreVerifySSL() { SSLContext sslContext = null;// 创建套接字对象 try { sslContext = SSLContext.getInstance("TLSv1.2");//指定TLS版本 } catch (NoSuchAlgorithmException e) { SourceCode.getInstance().output("创建套接字失败!", e); } // 实现X509TrustManager接口,用于绕过验证 X509TrustManager trustManager = new X509TrustManager() { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString) throws CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString) throws CertificateException { } @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } }; try { sslContext.init(null, new TrustManager[] { trustManager }, null);//初始化sslContext对象 } catch (KeyManagementException e) { SourceCode.getInstance().output("初始化套接字失败!", e); } return sslContext; }
下面是创建https协议的client的方法,其中用到了连接池的使用:
/** * 获取https协议请求对象 * * @return */ public static CloseableHttpClient getCloseableHttpsClients() { // 采用绕过验证的方式处理https请求 SSLContext sslcontext = createIgnoreVerifySSL(); // 设置协议http和https对应的处理socket链接工厂的对象 Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create() .register("http", PlainConnectionSocketFactory.INSTANCE) .register("https", new SSLConnectionSocketFactory(sslcontext)).build(); PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); HttpClients.custom().setConnectionManager(connManager); // 创建自定义的httpsclient对象 CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build(); return client; }
还有一个继承httpclient类,重写createDefault()方法来实现请求https的,经过实验,对于一些https协议是没有问题的,但是对于我测试的接口总是通不过,原因大概是没有经过连接池这一步原因导致的(个人判断,尚未印证)。
宣传一下自己的QQ群:群号:340964272。
X509TrustManager
相关文章推荐
- HttpClient_javax.net.ssl.SSLHandshakeException: sun.security.validator 问题解决,与环境有关
- https应用:避免HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常
- 发送请求错误Android:javax.net.ssl.SSLHandshakeException: Handshake failed
- 解决Java调用https服务证书错误javax.net.ssl.SSLHandshakeException
- https应用:避免HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常
- [Java][Weblogic] weblogic.net.http.SOAPHttpsURLConnection incompatible with javax.net.ssl.HttpsURLConnection解决办法
- https请求报错解决:javax.net.ssl.SSLException: Not trusted ...
- 处理Https 异常记录 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
- 解决sun.net.www.protocol.http.HttpURLConnection cannot be cast to javax.net.ssl.HttpsURLConnection
- 解决ant编译Tomcat7出错 javax.net.ssl.SSLHandshakeException
- carrot2 Workbench org.apache.http.client.HttpResponseException: Not Found 以及其他类找不到错误的解决办法
- 解决weblogic.net.http.SOAPHttpsURLConnection incompatible with javax.net.ssl.HttpsURLConnection
- httpclient 4.3中、https请求错误的解决办法
- HttpClient的”javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常
- Linux下tomcat配置ssl中报错问题的解决javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateExcepti
- httpclient对象请求:如果报这个错:javax.net.ssl.SSLException: hostname in certificate didn't match证书不匹配的主机名
- xUtils3 Https请求报错:javax.net.ssl.SSLPeerUnverifiedException: Hostname ***.****.**not verified,跳过证书检测
- javax.net.ssl.SSLHandshakeException: sun.security.validator 问题解决,与环境有关
- android 访问https 证书问题 报错javax.net.ssl.SSLHandshakeException
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq