完整异常信息为:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
问题出现原因是安全证书不信任。
我选择的方法是,发送请求的时候对带https的请求都选择信任
使用okhttp发送post请求pom如下:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.6.0</version>
</dependency>
代码如下:
public static JSONObject post(String url, HashMap<String, String> paramsMap) { Map<String, String> map = new HashMap<>(); //设置对所有https证书信任 TrustAllManager trustAllManager = new TrustAllManager(); OkHttpClient.Builder okHttpClientaBuilder = new OkHttpClient.Builder().sslSocketFactory(createTrustAllSSLFactory(trustAllManager), trustAllManager); //获得client OkHttpClient okHttpClient = okHttpClientaBuilder.build(); FormBody.Builder formBodyBuilder = new FormBody.Builder(); Set<String> keySet = paramsMap.keySet(); for (String key : keySet) { String value = paramsMap.get(key); formBodyBuilder.add(key, value); } FormBody formBody = formBodyBuilder.build(); Request request = new Request .Builder() .post(formBody) .url(url) .build(); JSONObject jason = null; try { Response response = okHttpClient.newCall(request).execute(); if (response.code() == 201) { map.put("message", "success"); map.put("status_code", "201"); jason = JSONObject.parseObject(JSONObject.toJSON(map).toString()); } else { jason = JSONObject.parseObject(response.body().string()); } } catch (Exception e) { e.printStackTrace(); } return jason; }
protected static SSLSocketFactory createTrustAllSSLFactory(TrustAllManager trustAllManager) { SSLSocketFactory ssfFactory = null; try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, new TrustManager[]{trustAllManager}, new SecureRandom()); ssfFactory = sc.getSocketFactory(); } catch (Exception ignored) { ignored.printStackTrace(); } return ssfFactory; } |
package com.otcbi.util.regwidutils; import javax.net.ssl.X509TrustManager; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; public class TrustAllManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } |