今天在向服务器发送http post请求的时候出现了unable to find valid certification path to requested target的错误,百度了下需要证书啥的。解决方式是在发送http请求的时候,可以过滤掉所有的https证书验证。
代码如下:
/**
* POST请求
*
* @param url
* @param data
* @return
*/
public String sendPost() {
LOG.info("send to tanggong : " + data);
String result = null;
CloseableHttpClient httpClient = HttpClients.createDefault();
//isNoSSL是否需要走特殊方法
if(isNoSSL)
{
httpClient = (CloseableHttpClient)wrapClient(httpClient);
}
HttpPost post = new HttpPost(httpUrl);
post.addHeader("Content-type","application/json; charset=utf-8");
post.setHeader("Accept", "application/json");
CloseableHttpResponse response = null;
try {
StringEntity sen = new StringEntity(data.toString(),Charset.forName("UTF-8"));
sen.setContentEncoding("UTF-8");
sen.setContentType("application/json");
post.setEntity(sen);
response = httpClient.execute(post);
if (response != null && response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
result = EntityUtils.toString(entity);
}
LOG.info("ZP return :" + result);
return result;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
httpClient.close();
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 避免HttpClient的”SSLPeerUnverifiedException: peer not authenticated”异常
* 不用导入SSL证书
* @param base
* @return
*/
public static HttpClient wrapClient(HttpClient base) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
throws java.security.cert.CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
throws java.security.cert.CertificateException {
// TODO Auto-generated method stub
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
};
ctx.init(null, new TrustManager[] { tm }, null);
SSLConnectionSocketFactory ssf = new SSLConnectionSocketFactory(ctx,NoopHostnameVerifier.INSTANCE);
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(ssf).build();
return httpclient;
} catch (Exception ex) {
ex.printStackTrace();
return HttpClients.createDefault();
}
}