用java做一个httpClient 发送https 的get请求,需要证书验证的那种,求大神指点一下!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java做一个httpClient 发送https 的get请求,需要证书验证的那种,求大神指点一下!相关的知识,希望对你有一定的参考价值。

网上好多都是 说忽略证书验证,信任全部证书,但是我想做一个 要证书验证的,老是抛出异常:javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated我的步骤是:1,生成密钥库:keytool -genkey -alias symantec -keyalg RSA -keysize 1024 -keystore F:/keystore/test2,导出要访问的网站的HTTPS地址对应的证书:F:/keystore/SY;3,将证书导入密钥库:keytool -export -alias symantec -file F:/keystore/SY -keystore F:/keystore/test没有财富值了求那我好心人帮帮我啊!!跪谢!!

你那个 SSLSocketFactory(ks) 是自己的类?

你有用过 KeyManager.init (...)? 和 TrustManager.init(...) ?

想要在连接建立过程上交互式的弹出确认对话框来的话需要我们自己提供一个 KeyManager 和 TrustManager 的实现类,这有点复杂,你可以看一个 Sun 的 X509KeyManager 是怎么做的,默认地情况下它是从自动搜索匹配的 subject ,我们需要用自己提供的方式弹出确认的过程还不是全自动,另外一个账户可能有多个数字证书,比如支付宝我们就有多个签发时间不一样的数字证书,在连接建立时 IE 会提示我们选择其中的一个来使用,银行的 U 盾在安装多张数字证书时也会提示我们选择其中一个对应到你正在使用的银行卡号的那张证书。追问

不需要弹窗,只需要 收到响应就行了 ,请问 大神 你看应该怎么弄啊?

追答

已经初始化了 KeyManager 和 TrustManager ?
KeyManager 是在出示证书时使用的,比如客户端访问服务器时服务器出示自己的证书,或者服务器请求客户端也出示我们的网银U盾客户端证书; 而 TrustManager 是在检查对方的证书时使用的,比如我们核对对方服务器的证书的根证书机构是否是在信任的列表中。即使使用了 HttpClient 这些第三方的API,这里面初始化证书的 KeyManager 和 TrustManager 这种设计应该的相似的,你有没有从 HttpClient 中发现如何让它们初始化的?比如是像传统的给 -D 参数或代码来 init 它们,又或者HttpClient 有个初始化的方法接受2个 keystore 参数自动初始化?
这个文章说不导入任何 SSL 证书就直接信任所有证书,它不会导致这个错误。

http://www.cnblogs.com/shipengzhi/archive/2012/08/22/2650953.html

追问

我知道不用导入证书的那种方法,我现在是想实现导入证书的,并验证的这种方法

参考技术A 貌似导入密钥库的证书要包括整个证书链,而且https网站部署的证书要是权威ca机构(比如国内的沃通,国外的geotrust等)颁发的受信任的证书

JAVA通过HttpClient发送HTTP请求的方法

HttpClient介绍

  HttpClient 不是一个浏览器。它是一个客户端的 HTTP 通信实现库。HttpClient的目标是发 送和接收HTTP 报文。HttpClient不会去缓存内容,执行 嵌入在 HTML 页面中的javascript 代码,猜测内容类型,重新格式化请求/重定向URI,或者其它和 HTTP 运输无关的功能。

HttpClient使用

  •   使用需要引入jar包,maven项目引入如下:
     1         <dependency>
     2             <groupId>org.apache.httpcomponents</groupId>
     3             <artifactId>httpclient</artifactId>
     4             <version>4.5</version>
     5         </dependency>
     6 
     7         <dependency>
     8             <groupId>org.apache.httpcomponents</groupId>
     9             <artifactId>httpcore</artifactId>
    10             <version>4.4.4</version>
    11         </dependency>
    12 
    13         <dependency>
    14             <groupId>org.apache.httpcomponents</groupId>
    15             <artifactId>httpmime</artifactId>
    16             <version>4.5</version>
    17         </dependency>

     

  •   使用方法,代码如下:
      1 package com.test;
      2 
      3 import java.io.File;
      4 import java.io.IOException;
      5 import java.util.Iterator;
      6 import java.util.List;
      7 import java.util.Map;
      8 
      9 import org.apache.http.HttpEntity;
     10 import org.apache.http.HttpStatus;
     11 import org.apache.http.client.config.RequestConfig;
     12 import org.apache.http.client.methods.CloseableHttpResponse;
     13 import org.apache.http.client.methods.HttpGet;
     14 import org.apache.http.client.methods.HttpPost;
     15 import org.apache.http.entity.ContentType;
     16 import org.apache.http.entity.StringEntity;
     17 import org.apache.http.entity.mime.MultipartEntityBuilder;
     18 import org.apache.http.entity.mime.content.FileBody;
     19 import org.apache.http.entity.mime.content.StringBody;
     20 import org.apache.http.impl.client.CloseableHttpClient;
     21 import org.apache.http.impl.client.HttpClientBuilder;
     22 import org.apache.http.impl.client.HttpClients;
     23 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
     24 import org.apache.http.util.EntityUtils;
     25 
     26 /**
     27  * 
     28  * @author H__D
     29  * @date 2016年10月19日 上午11:27:25
     30  *
     31  */
     32 public class HttpClientUtil {
     33 
     34     // utf-8字符编码
     35     public static final String CHARSET_UTF_8 = "utf-8";
     36 
     37     // HTTP内容类型。
     38     public static final String CONTENT_TYPE_TEXT_HTML = "text/xml";
     39 
     40     // HTTP内容类型。相当于form表单的形式,提交数据
     41     public static final String CONTENT_TYPE_FORM_URL = "application/x-www-form-urlencoded";
     42 
     43     // HTTP内容类型。相当于form表单的形式,提交数据
     44     public static final String CONTENT_TYPE_JSON_URL = "application/json;charset=utf-8";
     45     
     46 
     47     // 连接管理器
     48     private static PoolingHttpClientConnectionManager pool;
     49 
     50     // 请求配置
     51     private static RequestConfig requestConfig;
     52 
     53     static {
     54         pool = new PoolingHttpClientConnectionManager();
     55         // 设置连接池的最大连接数
     56         pool.setMaxTotal(50);
     57         // 设置每个路由的最大连接数,默认是2
     58         pool.setDefaultMaxPerRoute(5);
     59 
     60         // 设置请求超时时间
     61         requestConfig = RequestConfig.custom().setSocketTimeout(50000).setConnectTimeout(50000)
     62                 .setConnectionRequestTimeout(50000).build();
     63     }
     64 
     65     public static CloseableHttpClient getHttpClient() {
     66         // 从连接池中获取httpclient
     67         return HttpClientBuilder.create().setConnectionManager(pool).build();
     68     }
     69 
     70     /**
     71      * 发送Post请求
     72      * 
     73      * @param httpPost
     74      * @return
     75      */
     76     private static String sendHttpPost(HttpPost httpPost) {
     77 
     78         CloseableHttpClient httpClient = null;
     79         CloseableHttpResponse response = null;
     80         // 响应内容
     81         String responseContent = null;
     82         try {
     83             // 创建默认的httpClient实例.
     84             httpClient = HttpClients.createDefault();
     85             // 配置请求信息
     86             httpPost.setConfig(requestConfig);
     87             // 执行请求
     88             response = httpClient.execute(httpPost);
     89             // 得到响应实例
     90             HttpEntity entity = response.getEntity();
     91 
     92             // 可以获得响应头
     93             // Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE);
     94             // for (Header header : headers) {
     95             // System.out.println(header.getName());
     96             // }
     97 
     98             // 得到响应类型
     99             // System.out.println(ContentType.getOrDefault(response.getEntity()).getMimeType());
    100 
    101             // 判断响应状态
    102             if (response.getStatusLine().getStatusCode() >= 300) {
    103                 throw new Exception(
    104                         "HTTP Request is not success, Response code is " + response.getStatusLine().getStatusCode());
    105             }
    106 
    107             if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
    108                 responseContent = EntityUtils.toString(entity, CHARSET_UTF_8);
    109             }
    110 
    111         } catch (Exception e) {
    112             e.printStackTrace();
    113         } finally {
    114             try {
    115                 // 关闭连接,释放资源
    116                 if (response != null) {
    117                     response.close();
    118                 }
    119                 if (httpClient != null) {
    120                     httpClient.close();
    121                 }
    122             } catch (IOException e) {
    123                 e.printStackTrace();
    124             }
    125         }
    126         return responseContent;
    127     }
    128 
    129     /**
    130      * 发送Get请求
    131      * 
    132      * @param httpGet
    133      * @return
    134      */
    135     private static String sendHttpGet(HttpGet httpGet) {
    136 
    137         CloseableHttpClient httpClient = null;
    138         CloseableHttpResponse response = null;
    139         // 响应内容
    140         String responseContent = null;
    141         try {
    142             // 创建默认的httpClient实例.
    143             httpClient = HttpClients.createDefault();
    144             // 配置请求信息
    145             httpGet.setConfig(requestConfig);
    146             // 执行请求
    147             response = httpClient.execute(httpGet);
    148             // 得到响应实例
    149             HttpEntity entity = response.getEntity();
    150 
    151             // 可以获得响应头
    152             // Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE);
    153             // for (Header header : headers) {
    154             // System.out.println(header.getName());
    155             // }
    156 
    157             // 得到响应类型
    158             // System.out.println(ContentType.getOrDefault(response.getEntity()).getMimeType());
    159 
    160             // 判断响应状态
    161             if (response.getStatusLine().getStatusCode() >= 300) {
    162                 throw new Exception(
    163                         "HTTP Request is not success, Response code is " + response.getStatusLine().getStatusCode());
    164             }
    165 
    166             if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
    167                 responseContent = EntityUtils.toString(entity, CHARSET_UTF_8);
    168             }
    169 
    170         } catch (Exception e) {
    171             e.printStackTrace();
    172         } finally {
    173             try {
    174                 // 关闭连接,释放资源
    175                 if (response != null) {
    176                     response.close();
    177                 }
    178                 if (httpClient != null) {
    179                     httpClient.close();
    180                 }
    181             } catch (IOException e) {
    182                 e.printStackTrace();
    183             }
    184         }
    185         return responseContent;
    186     }
    187     
    188     
    189     
    190     /**
    191      * 发送 post请求
    192      * 
    193      * @param httpUrl
    194      *            地址
    195      */
    196     public static String sendHttpPost(String httpUrl) {
    197         // 创建httpPost
    198         HttpPost httpPost = new HttpPost(httpUrl);
    199         return sendHttpPost(httpPost);
    200     }
    201 
    202     /**
    203      * 发送 get请求
    204      * 
    205      * @param httpUrl
    206      */
    207     public static String sendHttpGet(String httpUrl) {
    208         // 创建get请求
    209         HttpGet httpGet = new HttpGet(httpUrl);
    210         return sendHttpGet(httpGet);
    211     }
    212     
    213     
    214 
    215     /**
    216      * 发送 post请求(带文件)
    217      * 
    218      * @param httpUrl
    219      *            地址
    220      * @param maps
    221      *            参数
    222      * @param fileLists
    223      *            附件
    224      */
    225     public static String sendHttpPost(String httpUrl, Map<String, String> maps, List<File> fileLists) {
    226         HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
    227         MultipartEntityBuilder meBuilder = MultipartEntityBuilder.create();
    228         if (maps != null) {
    229             for (String key : maps.keySet()) {
    230                 meBuilder.addPart(key, new StringBody(maps.get(key), ContentType.TEXT_PLAIN));
    231             }
    232         }
    233         if (fileLists != null) {
    234             for (File file : fileLists) {
    235                 FileBody fileBody = new FileBody(file);
    236                 meBuilder.addPart("files", fileBody);
    237             }
    238         }
    239         HttpEntity reqEntity = meBuilder.build();
    240         httpPost.setEntity(reqEntity);
    241         return sendHttpPost(httpPost);
    242     }
    243 
    244     /**
    245      * 发送 post请求
    246      * 
    247      * @param httpUrl
    248      *            地址
    249      * @param params
    250      *            参数(格式:key1=value1&key2=value2)
    251      * 
    252      */
    253     public static String sendHttpPost(String httpUrl, String params) {
    254         HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
    255         try {
    256             // 设置参数
    257             if (params != null && params.trim().length() > 0) {
    258                 StringEntity stringEntity = new StringEntity(params, "UTF-8");
    259                 stringEntity.setContentType(CONTENT_TYPE_FORM_URL);
    260                 httpPost.setEntity(stringEntity);
    261             }
    262         } catch (Exception e) {
    263             e.printStackTrace();
    264         }
    265         return sendHttpPost(httpPost);
    266     }
    267 
    268     /**
    269      * 发送 post请求
    270      * 
    271      * @param maps
    272      *            参数
    273      */
    274     public static String sendHttpPost(String httpUrl, Map<String, String> maps) {
    275         String parem = convertStringParamter(maps);
    276         return sendHttpPost(httpUrl, parem);
    277     }
    278 
    279     
    280     
    281     
    282     /**
    283      * 发送 post请求 发送json数据
    284      * 
    285      * @param httpUrl
    286      *            地址
    287      * @param paramsJson
    288      *            参数(格式 json)
    289      * 
    290      */
    291     public static String sendHttpPostJson(String httpUrl, String paramsJson) {
    292         HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
    293         try {
    294             // 设置参数
    295             if (paramsJson != null && paramsJson.trim().length() > 0) {
    296                 StringEntity stringEntity = new StringEntity(paramsJson, "UTF-8");
    297                 stringEntity.setContentType(CONTENT_TYPE_JSON_URL);
    298                 httpPost.setEntity(stringEntity);
    299             }
    300         } catch (Exception e) {
    301             e.printStackTrace();
    302         }
    303         return sendHttpPost(httpPost);
    304     }
    305     
    306     /**
    307      * 发送 post请求 发送xml数据
    308      * 
    309      * @param httpUrl   地址
    310      * @param paramsXml  参数(格式 Xml)
    311      * 
    312      */
    313     public static String sendHttpPostXml(String httpUrl, String paramsXml) {
    314         HttpPost httpPost = new HttpPost(httpUrl);// 创建httpPost
    315         try {
    316             // 设置参数
    317             if (paramsXml != null && paramsXml.trim().length() > 0) {
    318                 StringEntity stringEntity = new StringEntity(paramsXml, "UTF-8");
    319                 stringEntity.setContentType(CONTENT_TYPE_TEXT_HTML);
    320                 httpPost.setEntity(stringEntity);
    321             }
    322         } catch (Exception e) {
    323             e.printStackTrace();
    324         }
    325         return sendHttpPost(httpPost);
    326     }
    327     
    328 
    329     /**
    330      * 将map集合的键值对转化成:key1=value1&key2=value2 的形式
    331      * 
    332      * @param parameterMap
    333      *            需要转化的键值对集合
    334      * @return 字符串
    335      */
    336     public static String convertStringParamter(Map parameterMap) {
    337         StringBuffer parameterBuffer = new StringBuffer();
    338         if (parameterMap != null) {
    339             Iterator iterator = parameterMap.keySet().iterator();
    340             String key = null;
    341             String value = null;
    342             while (iterator.hasNext()) {
    343                 key = (String) iterator.next();
    344                 if (parameterMap.get(key) != null) {
    345                     value = (String) parameterMap.get(key);
    346                 } else {
    347                     value = "";
    348                 }
    349                 parameterBuffer.append(key).append("=").append(value);
    350                 if (iterator.hasNext()) {
    351                     parameterBuffer.append("&");
    352                 }
    353             }
    354         }
    355         return parameterBuffer.toString();
    356     }
    357 
    358     public static void main(String[] args) throws Exception {
    359 
    360         System.out.println(sendHttpGet("http://www.baidu.com"));
    361     }
    362 }

     

      

以上是关于用java做一个httpClient 发送https 的get请求,需要证书验证的那种,求大神指点一下!的主要内容,如果未能解决你的问题,请参考以下文章

JAVA通过HttpClient发送HTTP请求的方法

Java编程之通过HttpClient发送HTTP请求

Http (java)的post和get方式

使用User-Agent防止HttpClient发送http请求时403 Forbidden和安全拦截

Java httpClient 发送http请求

JAVA通过HttpClient发送HTTP请求