使用okhttp调用https信任所有证书工具类。
请求示例:
结果:
Caused by: 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
改造后:
OkhttpUtil:
/**
*
* @author GMaya
*/
public class OkhttpUtil {
private static final Logger log = LoggerFactory.getLogger(OkhttpUtil.class);
private static final String HTTP_JSON = "application/json; charset=utf-8";
private static final String HTTP_FORM = "application/x-www-form-urlencoded; charset=utf-8";
private static final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(120, TimeUnit.SECONDS).readTimeout(120, TimeUnit.SECONDS)
.sslSocketFactory(createSSLSocketFactory())
.hostnameVerifier(new HostnameVerifier() {
@Override public boolean verify(String s, SSLSession sslSession) {
return true;
}
})
.writeTimeout(120, TimeUnit.SECONDS).build();
private static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{
new TrustAllCerts() }, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
}
return ssfFactory;
}
/**
* get请求
* 对于小文档,响应体上的string()方法非常方便和高效。
* 但是,如果响应主体很大(大于1 MB),则应避免string(),
* 因为它会将整个文档加载到内存中。在这种情况下,将主体处理为流。
*
* @param url
* @return
*/
public static String httpGet(String url) {
if (url == null || "".equals(url)) {
log.error("url为null!");
return "";
}
Request.Builder builder = new Request.Builder();
Request request = builder.get().url(url).build();
try {
Response response = okHttpClient.newCall(request).execute();
if (response.code() == 200) {
log.info("http GET 请求成功; [url={}]", url);
// response.body().string() 此处只能读取一次
return response.body().string();
} else {
log.warn("Http GET 请求失败; [errorCode = {} , url={}]", response.code(), url);
}
} catch (IOException e) {
throw new RuntimeException("同步http GET 请求失败,url:" + url, e);
}
return null;
}
/**
* get方法,带头部信息
* @param url
* @param headers
* @return
*/
public static String httpGet(String url, Map<String, String> headers) {
if (headers.isEmpty()) {
return httpGet(url);
}
Request.Builder builder = new Request.Builder();
headers.forEach((String key, String value) -> builder.header(key, value));
Request request = builder.get().url(url).build();
try {
Response response = okHttpClient.newCall(request).execute();
if (response.code() == 200) {
log.info("http GET 请求成功; [url={}]", url);
return response.body().string();
} else {
log.warn("Http GET 请求失败; [errorxxCode = {} , url={}]", response.code(), url);
}
} catch (IOException e) {
throw new RuntimeException("同步http GET 请求失败,url:" + url, e);
}
return null;
}
/**
* 同步 POST调用 无Header
* @param url
* @param json
* @return
*/
public static String httpPostJson(String url, String json) {
if (url == null || "".equals(url)) {
log.error("url为null!");
return "";
}
MediaType JSON = MediaType.parse(HTTP_JSON);
RequestBody body = RequestBody.create(JSON, json);
Request.Builder requestBuilder = new Request.Builder().url(url);
Request request = requestBuilder.post(body).build();
try {
Response response = okHttpClient.newCall(request).execute();
if (response.code() == 200) {
log.info("http Post 请求成功; [url={}, requestContent={}]", url, json);
return response.body().string();
} else {
log.warn("Http POST 请求失败; [ errorCode = {}, url={}, param={}]", response.code(), url, json);
}
} catch (IOException e) {
throw new RuntimeException("同步http请求失败,url:" + url, e);
}
return null;
}
/**
* 同步 POST调用 有Header
*
* @param url
* @param headers
* @param json
* @return
*/
public static String httpPostJson(String url, Map<String, String> headers, String json) {
if (headers.isEmpty()) {
httpPostJson(url, json);
}
MediaType JSON = MediaType.parse(HTTP_JSON);
RequestBody body = RequestBody.create(JSON, json);
Request.Builder requestBuilder = new Request.Builder().url(url);
headers.forEach((k, v) -> requestBuilder.addHeader(k, v));
Request request = requestBuilder.post(body).build();
try {
Response response = okHttpClient.newCall(request).execute();
if (response.code() == 200) {
log.info("http Post 请求成功; [url={}, requestContent={}]", url, json);
return response.body().string();
} else {
log.warn("Http POST 请求失败; [ errorCode = {}, url={}, param={}]", response.code(), url, json);
}
} catch (IOException e) {
throw new RuntimeException("同步http请求失败,url:" + url, e);
}
return null;
}
}
TrustAllCerts:
/**
*
* @author GMaya
* @dateTime 2021/3/19 17:44
*/
public class TrustAllCerts implements X509TrustManager {
@Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s)
throws CertificateException {
}
@Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s)
throws CertificateException {
}
@Override public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
希望对大家有用!