用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请求,需要证书验证的那种,求大神指点一下!的主要内容,如果未能解决你的问题,请参考以下文章