okhttpUtil信任所有证书

使用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];
    }
}

希望对大家有用!

猜你喜欢

转载自blog.csdn.net/gfl1427097103/article/details/115008616
今日推荐