• 轻松把玩HttpClient之配置ssl,采用绕过证书验证实现https


    上篇文章说道httpclient不能直接访问https的资源,这次就来模拟一下环境,然后配置https测试一下。在前面的文章中,分享了一篇自己生成并在tomcat中配置ssl的文章《Tomcat配置SSL》,大家可以据此来在本地配置https。我已经配置好了,效果是这样滴:

    可以看到已经信任该证书(显示浅绿色小锁),浏览器可以正常访问。现在我们用代码测试一下:

    1. public static void main(String[] args) throws ParseException, IOException, KeyManagementException, NoSuchAlgorithmException, HttpProcessException {  
    2.     String url = "https://sso.tgb.com:8443/cas/login";  
    3.     String body = send(url, null, "utf-8");  
    4.     System.out.println("交易响应结果:");  
    5.     System.out.println(body);  
    6.     System.out.println("-----------------------------------");  
    7. }  

    发现抛出了异常,我知道的有两种方案(也许还有我不知道的方案),这里介绍第一种方案,也是用的比较多的方案——绕过证书验证。直接看代码吧:

    1. /** 
    2.  * 绕过验证 
    3.  *   
    4.  * @return 
    5.  * @throws NoSuchAlgorithmException  
    6.  * @throws KeyManagementException  
    7.  */  
    8. public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {  
    9.     SSLContext sc = SSLContext.getInstance("SSLv3");  
    10.   
    11.     // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法  
    12.     X509TrustManager trustManager = new X509TrustManager() {  
    13.         @Override  
    14.         public void checkClientTrusted(  
    15.                 java.security.cert.X509Certificate[] paramArrayOfX509Certificate,  
    16.                 String paramString) throws CertificateException {  
    17.         }  
    18.   
    19.         @Override  
    20.         public void checkServerTrusted(  
    21.                 java.security.cert.X509Certificate[] paramArrayOfX509Certificate,  
    22.                 String paramString) throws CertificateException {  
    23.         }  
    24.   
    25.         @Override  
    26.         public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
    27.             return null;  
    28.         }  
    29.     };  
    30.   
    31.     sc.init(null, new TrustManager[] { trustManager }, null);  
    32.     return sc;  
    33. }  

    然后修改原来的send方法:

    1. /** 
    2.  * 模拟请求 
    3.  *  
    4.  * @param url       资源地址 
    5.  * @param map   参数列表 
    6.  * @param encoding  编码 
    7.  * @return 
    8.  * @throws NoSuchAlgorithmException  
    9.  * @throws KeyManagementException  
    10.  * @throws IOException  
    11.  * @throws ClientProtocolException  
    12.  */  
    13. public static String send(String url, Map<String,String> map,String encoding) throws KeyManagementException, NoSuchAlgorithmException, ClientProtocolException, IOException {  
    14.     String body = "";  
    15.     //采用绕过验证的方式处理https请求  
    16.     SSLContext sslcontext = createIgnoreVerifySSL();  
    17.       
    18.        // 设置协议http和https对应的处理socket链接工厂的对象  
    19.        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()  
    20.            .register("http", PlainConnectionSocketFactory.INSTANCE)  
    21.            .register("https", new SSLConnectionSocketFactory(sslcontext))  
    22.            .build();  
    23.        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);  
    24.        HttpClients.custom().setConnectionManager(connManager);  
    25.   
    26.        //创建自定义的httpclient对象  
    27.     CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();  
    28. /       CloseableHttpClient client = HttpClients.createDefault();  
    29.       
    30.     //创建post方式请求对象  
    31.     HttpPost httpPost = new HttpPost(url);  
    32.       
    33.     //装填参数  
    34.     List<NameValuePair> nvps = new ArrayList<NameValuePair>();  
    35.     if(map!=null){  
    36.         for (Entry<String, String> entry : map.entrySet()) {  
    37.             nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));  
    38.         }  
    39.     }  
    40.     //设置参数到请求对象中  
    41.     httpPost.setEntity(new UrlEncodedFormEntity(nvps, encoding));  
    42.   
    43.     System.out.println("请求地址:"+url);  
    44.     System.out.println("请求参数:"+nvps.toString());  
    45.       
    46.     //设置header信息  
    47.     //指定报文头【Content-type】、【User-Agent】  
    48.     httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");  
    49.     httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");  
    50.       
    51.     //执行请求操作,并拿到结果(同步阻塞)  
    52.     CloseableHttpResponse response = client.execute(httpPost);  
    53.     //获取结果实体  
    54.     HttpEntity entity = response.getEntity();  
    55.     if (entity != null) {  
    56.         //按指定编码转换结果实体为String类型  
    57.         body = EntityUtils.toString(entity, encoding);  
    58.     }  
    59.     EntityUtils.consume(entity);  
    60.     //释放链接  
    61.     response.close();  
    62.        return body;  
    63. }  

    现在再进行测试,发现果然通了。

    下篇介绍另一种方案,应对自己生成的证书,敬请期待。

    转自 http://blog.csdn.net/xiaoxian8023

  • 相关阅读:
    今天到了1000分了,庆祝一下
    中文vs2008安装 mvc 1
    火车采集器使用感受
    存储过程中的case用法
    作为开发者的反思
    什么是程序员的优秀品质?
    遇到了乱码的问题(转载)
    利用网址导航站点推广
    国内优秀网址导航站总结 (转载)
    Unable to read local eventlog错误解决(转载)
  • 原文地址:https://www.cnblogs.com/endtel/p/7634471.html
Copyright © 2020-2023  润新知