通过httpclient调用https接口的时候出现下面这个错误
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
意思是调用的时候没有找到相关的证书,无法访问,这时候可以通过绕过证书的方法。
一、先创建一个绕过验证的方法
/**
* 绕过验证
* @return SSLContext
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance("SSLv3");
// 实现一个X509TrustManager接口,用于绕过验证
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[] { trustManager }, null);
return sslContext;
}
二、调用方法
{
//调用绕过证书方法 我将静态方法放在IgnoreVerifySSL类下面
SSLContext sslcontext = IgnoreVerifySSL.createIgnoreVerifySSL();
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", new SSLConnectionSocketFactory(sslcontext))
.build();
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
HttpClients.custom().setConnectionManager(connManager);
//创建自定义的httpclient对象
CloseableHttpClient httpclient = HttpClients.custom().setConnectionManager(connManager).build();
}
String url=getParam("url"); //输入要访问的接口地址
JSONObject resultjson = new JSONObject();
// CloseableHttpClient httpclient = HttpClients.createDefault();
RequestConfig config = RequestConfig.custom().setConnectTimeout(10000).setConnectionRequestTimeout(10000).setSocketTimeout(10000).build();
try {
HttpPost httppost = new HttpPost(url);
httppost.setConfig(config);
httppost.setProtocolVersion(HttpVersion.HTTP_1_0);
httppost.addHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
httppost.addHeader("Accept", "application/json");
httppost.addHeader("Content-Type", "application/json");
StringEntity entity = new StringEntity(json, "UTF-8");
httppost.setEntity(entity);
HttpResponse responseBody = httpclient.execute(httppost);
String result = null;
if (responseBody != null) {
HttpEntity resEntity = responseBody.getEntity();
if (resEntity != null) {
result = EntityUtils.toString(resEntity, "utf-8");
}
}
resultjson = JSON.parseObject(result);
} catch (Exception e) {
}