当前位置:   article > 正文

apache httpclient 连接池 工具_httpclient发送https请求以及SSLHandshakeException解决办法...

连接池中tls问题解决方法

本人在做接口自动化的过程中,遇到了请求第三方https协议请求,在经过了短暂的知识重新学习之后,写完代码执行起来总是遇到一个异常,在用客户端执行请求的时候抛出来的,下面是异常的信息:

  1. 1Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
  2. 2 at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
  3. 3 at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
  4. 4 at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023)
  5. 5 at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125)
  6. 6 at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
  7. 7 at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
  8. 8 at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
  9. 9 at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
  10. 10 at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
  11. 11 at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:134)
  12. 12 at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
  13. 13 at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
  14. 14 at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
  15. 15 at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
  16. 16 at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
  17. 17 at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
  18. 18 at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
  19. 19 at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
  20. 20 at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)

查阅了很多资料,大部分都说是因为java本身安全机制引起的,重新去官网下载jar包替换即可。以下是修改方法:

因为jdk中jce的安全机制导致报的错,要去oracle官网下载对应的jce包替换jdk中的jce包。
jce所在地址: %JAVA_HOME%jrelibsecurity里的local_policy.jar,US_export_policy.jar

JDK7
JDK8

具体异常教程如下:传送门

在原因的第二种里面,有一个需要校验本身的TLS的版本和服务端版本是否一致,我就是在这里出了问题,导致的这个异常。因为我一直用的默认参数去创建新的套接字对象。下面是我用Charles拦截的请求的header信息:

fe34a6381232242b9df361c6ceb9f244.png

上面圈起来的地方就是现实的服务器的TLS版本,相应地改掉自己代码的中设置版本的地方即可。

下面是我的代码:大多数参考了网上的教程,自己做了一些修改,大同小异。下面是获取SSLcontext对象的方法,实现了X509TrustManager接口,里面方法不用修改。

  1. 1 /**
  2. 2 * 获取SSL套接字对象 重点重点:设置tls协议的版本
  3. 3 *
  4. 4 * @return
  5. 5 */
  6. 6 public static SSLContext createIgnoreVerifySSL() {
  7. 7 SSLContext sslContext = null;// 创建套接字对象
  8. 8 try {
  9. 9 sslContext = SSLContext.getInstance("TLSv1.2");//指定TLS版本
  10. 10 } catch (NoSuchAlgorithmException e) {
  11. 11 SourceCode.getInstance().output("创建套接字失败!", e);
  12. 12 }
  13. 13 // 实现X509TrustManager接口,用于绕过验证
  14. 14 X509TrustManager trustManager = new X509TrustManager() {
  15. 15 @Override
  16. 16 public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
  17. 17 String paramString) throws CertificateException {
  18. 18 }
  19. 19
  20. 20 @Override
  21. 21 public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
  22. 22 String paramString) throws CertificateException {
  23. 23 }
  24. 24
  25. 25 @Override
  26. 26 public java.security.cert.X509Certificate[] getAcceptedIssuers() {
  27. 27 return null;
  28. 28 }
  29. 29 };
  30. 30 try {
  31. 31 sslContext.init(null, new TrustManager[] { trustManager }, null);//初始化sslContext对象
  32. 32 } catch (KeyManagementException e) {
  33. 33 SourceCode.getInstance().output("初始化套接字失败!", e);
  34. 34 }
  35. 35 return sslContext;
  36. 36 }

下面是创建https协议的client的方法,其中用到了连接池的使用:

  1. 1 /**
  2. 2 * 获取https协议请求对象
  3. 3 *
  4. 4 * @return
  5. 5 */
  6. 6 public static CloseableHttpClient getCloseableHttpsClients() {
  7. 7 // 采用绕过验证的方式处理https请求
  8. 8 SSLContext sslcontext = createIgnoreVerifySSL();
  9. 9 // 设置协议http和https对应的处理socket链接工厂的对象
  10. 10 Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
  11. 11 .register("http", PlainConnectionSocketFactory.INSTANCE)
  12. 12 .register("https", new SSLConnectionSocketFactory(sslcontext)).build();
  13. 13 PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
  14. 14 HttpClients.custom().setConnectionManager(connManager);
  15. 15 // 创建自定义的httpsclient对象
  16. 16 CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
  17. 17 return client;
  18. 18 }

还有一个继承httpclient类,重写createDefault()方法来实现请求https的,经过实验,对于一些https协议是没有问题的。

技术类文章精选

  • java一行代码打印心形
  • Linux性能监控软件netdata中文汉化版
  • 接口测试代码覆盖率(jacoco)方案分享
  • 性能测试框架
  • 如何在Linux命令行界面愉快进行性能测试
  • 图解HTTP脑图
  • 如何测试概率型业务接口
  • httpclient处理多用户同时在线
  • 将swagger文档自动变成测试代码
  • 五行代码构建静态博客
  • httpclient如何处理302重定向
  • 基于java的直线型接口测试框架初探
  • Tcloud 云测平台--集大成者
  • 如何测试概率型业务接口
  • python plotly处理接口性能测试数据方法封装
  • 单点登录性能测试方案

非技术文章精选

  • 为什么选择软件测试作为职业道路?
  • 成为杰出Java开发人员的10个步骤
  • 写给所有人的编程思维
  • 自动化测试的障碍
  • 自动化测试的问题所在
  • 测试之《代码不朽》脑图
  • 成为优秀自动化测试工程师的7个步骤
  • 优秀软件开发人员的态度
  • 如何正确执行功能API测试
  • 未来10年软件测试的新趋势-上
  • 未来10年软件测试的新趋势-上
  • 自动化测试解决了什么问题
  • 17种软件测试人员常用的高效技能-上
  • 17种软件测试人员常用的高效技能-下
  • 手动测试存在的重要原因
  • 编写测试用例的17个技巧

大咖风采

  • Tcloud 云测平台--集大成者
  • Android App 测试工具及知识大集合
  • 4399AT UI自动化CI与CD
  • Android App常规测试内容
  • JVM的对象和堆

点击查看公众号地图

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/907859
推荐阅读
相关标签
  

闽ICP备14008679号