java实现 HTTP/HTTPS请求绕过证书检测代码实现

1、开发需求

需要实现在服务端发起HTTP/HTTPS请求,访问其他程序资源。

2、URLConnection和HTTPClient的比较

HttpClient是个很不错的开源框架,封装了访问http的请求头,参数,内容体,响应等等,
DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。

3、使用Apache的HttpClient发送GET和POST请求

1. 使用帮助类HttpClients创建CloseableHttpClient对象.
2. 基于要发送的HTTP请求类型创建HttpGet或者HttpPost实例.
3. 使用addHeader方法添加请求头部,诸如User-Agent, Accept-Encoding等参数.
4. 对于POST请求,创建NameValuePair列表,并添加所有的表单参数.然后把它填充进HttpPost实体.
5. 通过执行此HttpGet或者HttpPost请求获取CloseableHttpResponse实例
6. 从此CloseableHttpResponse实例中获取状态码,错误信息,以及响应页面等等.
7. 最后关闭HttpClient资源.

4、SSL与TLS的区别以及介绍
SSL是Netscape公司所提出的安全保密协议,在浏览器(如Internet Explorer、Netscape Navigator)和Web服务器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之间构造安全通道来进行数据传输,SSL运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道,它采用了RC4、MD5以及RSA等加密算法,使用40 位的密钥,适用于商业信息的加密。
同时,Netscape公司相应开发了HTTPS协议并内置于其浏览器中。
HTTPS实际上就是HTTP over SSL,它使用默认端口443,而不是像HTTP那样使用端口80来和TCP/IP进行通信。
HTTPS协议使用SSL在发送方把原始数据进行加密,然后在接受方进行解密,加密和解密需要发送方和接受方通过交换共知的密钥来实现,因此,所传送的数据不容易被网络黑客截获和解密。 然而,加密和解密过程需要耗费系统大量的开销,严重降低机器的性能,相关测试数据表明使用HTTPS协议传输数据的工作效率只有使用HTTP协议传输的十分之一。假如为了安全保密,将一个网站所有的Web应用都启用SSL技术来加密,并使用HTTPS协议进行传输,那么该网站的性能和效率将会大大降低,而且没有这个必要,因为一般来说并不是所有数据都要求那么高的安全保密级别。

TLS
安全传输层协议
  TLS:Transport Layer Security
  安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。

5、 post请求封装的工具类

  1. import java.io.BufferedOutputStream;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.lang.reflect.Method;
  7. import java.net.URLDecoder;
  8. import java.net.URLEncoder;
  9. import java.security.KeyManagementException;
  10. import java.security.KeyStoreException;
  11. import java.security.NoSuchAlgorithmException;
  12. import java.security.cert.CertificateException;
  13. import java.security.cert.X509Certificate;
  14. import java.util.ArrayList;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.Map.Entry;
  19.  
  20. import com.sun.corba.se.impl.orbutil.threadpool.TimeoutException;
  21. import org.apache.commons.httpclient.util.TimeoutController;
  22. import org.apache.http.NameValuePair;
  23. import org.apache.http.client.config.RequestConfig;
  24. import org.apache.http.client.entity.UrlEncodedFormEntity;
  25. import org.apache.http.client.methods.CloseableHttpResponse;
  26. import org.apache.http.client.methods.HttpPost;
  27. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  28. import org.apache.http.entity.StringEntity;
  29. import org.apache.http.impl.client.CloseableHttpClient;
  30. import org.apache.http.impl.client.HttpClients;
  31. import org.apache.http.message.BasicNameValuePair;
  32. import org.apache.http.util.EntityUtils;
  33. import org.apache.log4j.Logger;
  34. import cn.qtone.hjy.service.bean.yd.sync.AccountPasswordInfoSyncItem;
  35. import cn.qtone.hjy.service.bean.yd.sync.OrderInfoSyncItem;
  36. import cn.qtone.hjy.service.bean.yd.sync.YdOrderRelationshipInfoSyncItem;
  37. import cn.qtone.hjy.service.core.DES;
  38. import cn.qtone.hjy.service.dao.YdEduDao;
  39. import cn.qtone.util.SpringUtil;
  40. import com.alibaba.fastjson.JSONObject;
  41. import javax.net.ssl.SSLContext;
  42. import javax.net.ssl.TrustManager;
  43. import javax.net.ssl.X509TrustManager;
  44.  
  45. public class HttpClientUtil {
  46.  
  47. static Logger log = Logger.getLogger(HttpClientUtil.class) ;
  48.  
  49. private static RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(10000).setConnectTimeout(10000).build();//设置请求和传输超时时间
  50.  
  51. private static CloseableHttpClient httpclient = HttpClients.createDefault();
  52.  
  53. public static String send(String httpUrl, String message) throws IOException {
  54. String result = null ;
  55. HttpPost httpPost = new HttpPost(httpUrl);
  56. //设置数据读取超时5s 传输超时5s 链接请求超时5s
  57. RequestConfig requestConfig = RequestConfig.custom()
  58. .setSocketTimeout(5000)
  59. .setConnectTimeout(5000)
  60. .setConnectionRequestTimeout(5000)
  61. .build();
  62. httpPost.setConfig(requestConfig) ;
  63. message = URLEncoder.encode(message, "UTF-8") ;
  64. StringEntity entity = new StringEntity(message);
  65. httpPost.setEntity(entity);
  66. CloseableHttpResponse response = httpclient.execute(httpPost);
  67. BufferedReader in = null ;
  68. try {
  69. InputStream content = response.getEntity().getContent() ;
  70. in = new BufferedReader(new InputStreamReader(content));
  71. StringBuilder sb = new StringBuilder();
  72. String line = "" ;
  73. while ((line = in.readLine()) != null) {
  74. sb.append(line);
  75. }
  76. result = sb.toString() ;
  77. System.out.println("接收原始报文:" + URLDecoder.decode(result, "UTF-8")) ;
  78. } finally {
  79. EntityUtils.consume(response.getEntity());
  80. response.close();
  81. }
  82. return result ;
  83. }
  84.  
  85. public static String post(String httpUrl, String message) throws Exception {
  86. String result = null ;
  87. CloseableHttpClient httpclient = HttpClients.createDefault();
  88. BufferedReader in = null ;
  89. HttpPost httpPost = new HttpPost(httpUrl);
  90. httpPost.setConfig(requestConfig);
  91. List <NameValuePair> nvps = new ArrayList <NameValuePair>();
  92. nvps.add(new BasicNameValuePair("tokenId", DES.encrypt(message)));
  93. httpPost.setEntity(new UrlEncodedFormEntity(nvps));
  94. try {
  95. System.out.println("发送报文:" + message);
  96. System.out.println("发送报文:" + DES.encrypt(message)) ;
  97. CloseableHttpResponse response = httpclient.execute(httpPost);
  98. InputStream content = response.getEntity().getContent() ;
  99. in = new BufferedReader(new InputStreamReader(content, "UTF-8"));
  100. StringBuilder sb = new StringBuilder();
  101. String line = "" ;
  102. while ((line = in.readLine()) != null) {
  103. sb.append(line);
  104. }
  105. System.out.println("响应报文:" + sb.toString()) ;
  106. //result = URLDecoder.decode(sb.toString(), "UTF-8") ;
  107. //result = DES.decrypt(result) ;
  108. //System.out.println("完成:" + JSONObject.parseObject(result) + "\n");
  109. return result ;
  110. } catch (Exception e) {
  111. e.printStackTrace() ;
  112. } finally {
  113. httpclient.close();
  114. }
  115. return null ;
  116. }
  117.  
  118. /**
  119. * 发起post请求,请求参数以Map集合形式传入,封装到List <NameValuePair> 发起post请求
  120. * @param httpUrl
  121. * @param params
  122. * @return
  123. * @throws Exception
  124. */
  125. public static String post(String httpUrl, Map<String, String> params) throws Exception {
  126. String result = null ;
  127. CloseableHttpClient httpclient = createSSLClientDefault();
  128. //httpclient.
  129. //httpclient.
  130. BufferedReader in = null ;
  131. HttpPost httpPost = new HttpPost(httpUrl);
  132. httpPost.setConfig(requestConfig);
  133. List <NameValuePair> nvps = new ArrayList <NameValuePair>();
  134. StringBuffer paramsBuf = new StringBuffer() ;
  135. for(Entry<String, String> e : params.entrySet()) {
  136. nvps.add(new BasicNameValuePair(e.getKey(), e.getValue()));
  137. paramsBuf.append("&").append(e.getKey()).append("=").append(e.getValue()) ;
  138. }
  139. httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
  140. try {
  141. // 报文参数27:&id=jn-3-767744&groupPlatProTerminalId=119667&extend=uwJZ8j3CkpGPL4rM5J6KJhjR99O7yAe3BAGLS8ooI8ijNqKHfzTaK6W9wQvjZEVOmWJ3HxFb2O9D
  142. // wDbe3++UiQ==&xxtCode=370000&terminalType=1&role=3&type=3
  143. System.out.println("post请求报文地址:" + httpUrl+"?"+paramsBuf.toString()) ;
  144. CloseableHttpResponse response = httpclient.execute(httpPost);
  145. InputStream content = response.getEntity().getContent() ;
  146. in = new BufferedReader(new InputStreamReader(content, "UTF-8"));
  147. // in = new BufferedReader(new InputStreamReader(content, "GBK"));
  148. // in = new BufferedReader(new InputStreamReader(content));
  149. StringBuilder sb = new StringBuilder();
  150. String line = "" ;
  151. while ((line = in.readLine()) != null) {
  152. sb.append(line);
  153. }
  154. result = sb.toString() ;
  155. System.out.println("响应报文:" + result) ;
  156. // 响应报文:{"ret":0,"msg":"成功","callbackurl":"https://edu.10086.cn/test-sso/login?service=http%3A%2F%2F112.35.7.169%3A9010%2Feducloud%2Flogin%2Flogin%3Ftype%3D3%26mode%3D1%26groupId%3D4000573%26provincePlatformId%3D54","accesstoken":"2467946a-bee9-4d8c-8cce-d30181073b75"}Í
  157. //记录报文日志
  158. YdEduDao dao = SpringUtil.getBean(YdEduDao.class);
  159. dao.saveCallLog(httpUrl, paramsBuf.toString(), result); // HJY_SERVICE_LOG
  160.  
  161. return result ;
  162. } catch (Exception e) {
  163. e.printStackTrace() ;
  164. } finally {
  165. httpclient.close();
  166. }
  167. return null ;
  168. }
  169.  
  170. public static JSONObject postData(String httpUrl, Object obj) throws Exception {
  171. JSONObject json = null;
  172. try{
  173. String result = post(httpUrl,obj);
  174. json = JSONObject.parseObject(result);
  175. }catch(TimeoutException e){
  176. System.out.println("请求超时了:"+httpUrl);
  177. throw e;
  178. }finally {
  179. return json ;
  180. }
  181. }
  182.  
  183. public static String post(String httpUrl, Object obj) throws Exception {
  184. Map<String, String> params = getParamData(obj);
  185. String result = null ;
  186.  
  187. try {
  188. result = post(httpUrl,params);
  189. return result ;
  190. } catch (Exception e) {
  191. e.printStackTrace() ;
  192. } finally {
  193. httpclient.close();
  194. }
  195. return null ;
  196. }
  197.  
  198. private static Map<String, String> getParamData(Object obj) {
  199.  
  200. Class cla = obj.getClass();
  201. Map<String, String> map = new HashMap<String, String>();
  202. Method[] methods = cla.getDeclaredMethods();
  203. try {
  204. for (Method m : methods) {
  205. String mname = m.getName();
  206. if (mname.startsWith("get")) {
  207. String name = mname.substring(3, mname.length());// 截取字段
  208. name = name.substring(0, 1).toLowerCase()
  209. + name.substring(1, name.length());// 把首字母变小写
  210. String value = m.invoke(obj)==null?"":m.invoke(obj).toString();
  211. if(cla.equals(YdOrderRelationshipInfoSyncItem.class)&&name.equals("unionId")&&(value==null||value.equals(""))){
  212. continue;
  213. }
  214. map.put(name,value);// 取值
  215. }
  216.  
  217. }
  218. Class superclass = cla.getSuperclass();
  219. while (!superclass.equals(Object.class)) {
  220. Method[] superclassmethods = superclass.getDeclaredMethods();
  221. for (Method m : superclassmethods) {
  222. String mname = m.getName();
  223. if (mname.startsWith("get")) {
  224. String name = mname.substring(3, mname.length());// 截取字段
  225. name = name.substring(0, 1).toLowerCase()
  226. + name.substring(1, name.length());// 把首字母变小写
  227. String value = m.invoke(obj)==null?"":m.invoke(obj).toString();
  228.  
  229. if((cla.equals(OrderInfoSyncItem.class)||cla.equals(AccountPasswordInfoSyncItem.class)||cla.equals(YdOrderRelationshipInfoSyncItem.class))&&name.equals("operation"))
  230. continue;
  231.  
  232. map.put(name,value);// 取值
  233. }
  234.  
  235. }
  236. superclass = superclass.getSuperclass();
  237.  
  238. }
  239. } catch (Exception e) {
  240. e.printStackTrace();
  241. }
  242.  
  243. return map;
  244. }
  1. public static CloseableHttpClient createSSLClientDefault(){
  2.  
  3. try {
  4. //SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
  5. // 在JSSE中,证书信任管理器类就是实现了接口X509TrustManager的类。我们可以自己实现该接口,让它信任我们指定的证书。
  6. // 创建SSLContext对象,并使用我们指定的信任管理器初始化
  7. //信任所有
  8. X509TrustManager x509mgr = new X509TrustManager() {
  9.  
  10. //  该方法检查客户端的证书,若不信任该证书则抛出异常
  11. public void checkClientTrusted(X509Certificate[] xcs, String string) {
  12. }
  13. //   该方法检查服务端的证书,若不信任该证书则抛出异常
  14. public void checkServerTrusted(X509Certificate[] xcs, String string) {
  15. }
  16. //  返回受信任的X509证书数组。
  17. public X509Certificate[] getAcceptedIssuers() {
  18. return null;
  19. }
  20. };
  21. SSLContext sslContext = SSLContext.getInstance("TLS");
  22. sslContext.init(null, new TrustManager[] { x509mgr }, null);
  23. ////创建HttpsURLConnection对象,并设置其SSLSocketFactory对象
  24. SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  25.  
  26. // HttpsURLConnection对象就可以正常连接HTTPS了,无论其证书是否经权威机构的验证,只要实现了接口X509TrustManager的类MyX509TrustManager信任该证书。
  27. return HttpClients.custom().setSSLSocketFactory(sslsf).build();
  28.  
  29. } catch (KeyManagementException e) {
  30.  
  31. e.printStackTrace();
  32.  
  33. } catch (NoSuchAlgorithmException e) {
  34.  
  35. e.printStackTrace();
  36.  
  37. } catch (Exception e) {
  38.  
  39. e.printStackTrace();
  40.  
  41. }
  42.  
  43. // 创建默认的httpClient实例.
  44. return HttpClients.createDefault();
  45.  
  46. }
  47.  
  48. }

另外,在针对http进行升级时,在HTTPS的证书未经权威机构认证的情况下,访问HTTPS站点的两种方法,一种方法是把该证书导入到Java的TrustStore文件中,另一种是自己实现并覆盖JSSE缺省的证书信任管理器类。两种方法各有优缺点,第一种方法不会影响JSSE的安全性,但需要手工导入证书;第二种方法虽然不用手工导入证书,但需要小心使用,否则会带来一些安全隐患。

java实现 HTTP/HTTPS请求绕过证书检测代码实现的更多相关文章

  1. Java实现 HTTP/HTTPS请求绕过证书检测

    java实现 HTTP/HTTPS请求绕过证书检测 一.Java实现免证书访问Https请求 创建证书管理器类 import java.security.cert.CertificateExcepti ...

  2. 简述Java中Http/Https请求监听方法

    一.工欲善其事必先利其器 做Web开发的人总免不了与Http/Https请求打交道,很多时候我们都希望能够直观的的看到我们发送的请求参数和服务器返回的响应信息,这个时候就需要借助于某些工具啦.本文将采 ...

  3. java实现的https请求

    转载并修改自 http://www.blogjava.net/etlan/archive/2006/06/29/55767.html Https请求 超文本传输协议HTTP协议:被用于在Web浏览器和 ...

  4. java如何发起https请求

    1.写一个SSLClient类,继承至HttpClient import java.security.cert.CertificateException; import java.security.c ...

  5. java的https请求解决证书问题

    package sqr.srchSpider.utils; import java.security.SecureRandom; import java.security.cert.Certifica ...

  6. 【问题记录】Java服务发起HTTPS请求报错:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException

    问题报错 今天上线了我开发的一个OAuth2单点登录客户端的实现,在测试系统验证没问题,到生产环境由于单点登录服务端HTTPS协议,报错如下: I/O error on POST request fo ...

  7. HTTPS请求 SSL证书验证

    import urllib2 url = "https://www.12306.cn/mormhweb/" headers = {"User-Agent": & ...

  8. UrlConnection doPost Https请求 、编码设置

    UrlConnection doPost Https请求 .编码设置 UrlConnection doPost方法 /** * 发送POST请求 * * @param url 请求地址url * @p ...

  9. Asp.Net报https请求报传输流收到意外的 EOF 或 0 个字节

    网上搜索,都说是.net framework版本太低,改为.net 4.5以上版本即可.于是使用vs2017环境测试了下,使用.net framework4.5版本确实可以正常返回结果,低于这个版本就 ...

随机推荐

  1. Java 基础 面向对象之关键字内部类代码块修饰符

    final final概念 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后 ...

  2. zabbix 监控 redis

    redis  可以直接使用zabbix官方的模板 模板地址: https://github.com/blacked/zbx_redis_template redis 主机通过脚本把数据推送到zabbi ...

  3. [Java in NetBeans] Lesson 13. Multidimensional Arrays

    这个课程的参考视频和图片来自youtube. 主要学到的知识点有: 1. Multidimensional Array: Array that has more than one dimension. ...

  4. 如何比sketch和axure更方便地给原型做交互?

    在快速的工作环境中,我们现在都希望在工作的各个环节中提高效率.有些产品设计师们做产品原型时,会感觉sketch或者axure添加交互的方式不够快捷.下面就提供一种解决方案. 使用工具:墨刀. 交互链接 ...

  5. js使用的一些实用技巧

    1.jquery中页面定时调用ajax方法 function SetContinueSend(param1,param2, func){ func.call(null,param1,param2) } ...

  6. jenkins 关联 钉钉机器人

    注意:Jenkins URL配置中需要在最后添加"/",要不然会导致拼接的Url出错,这里填写有问题会导致无法从钉钉中跳转到Jenkins任务

  7. iOS 设计模式-NSNotificationCenter 通知中心

    通知介绍 每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信 任何一个对象都可以向通知中心发布通知(NSNotification),描述 ...

  8. cocos2dx 3.x(加载网络自定义头像)

    // //  Connection.h //  XXDemo // //  Created by LeeHonGee on 14-9-4. // // #ifndef __XXDemo__Connec ...

  9. Mybatis中的常用的三个查询方法

    selectList 用于查询多条数据的情况,返回值是一个list集合.如果没有查到任何数据,返回没有元素的集合(空集合,不是null) selectOne 用于查询单条数据的情况,返回值是一个对象, ...

  10. js中call,caller,callee,aplly

    1.函数的caller属性 (1).区分函数是在函数体调用还是顶层代码中调用:顶层中调用函数,该函数的caller属性返回null,在函数中调用,会返回调用发i函数的函数: <script> ...