JDK HttpClient HTTPS请求绕过SSL证书校验

import com.alibaba.fastjson2.JSONObject;

import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;
import java.net.URI;
import java.net.http.HttpRequest;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.time.Duration;

/**
 * JDK HttpClient HTTPS请求绕过SSL证书校验
 *
 * @module
 * @author:lkl
 * @date: 2024-03-23
 */
public class JDKHttpsUtil {

    /**
     * 绕过SSL证书校验GET请求
     * @param url
     * @return:
     * @Author: lkl
     * @date:
     */
    public static JSONObject doGet(String url) throws Exception {
        SSLContext sc = getTrustSSLContext();
        //jdk自带的http客户端只能验证受信任证书,若要跳过证书验证只能设置下面的参数
        System.setProperty("jdk.internal.httpclient.disableHostnameVerification", "true");
        HttpRequest.Builder httpRequestBuilder = HttpRequest.newBuilder().GET().timeout(Duration.ofMinutes(10));
        java.net.http.HttpClient httpClient = java.net.http.HttpClient.newBuilder().sslContext(sc).build();
        HttpRequest request = httpRequestBuilder.copy().uri(URI.create(url)).build();
        java.net.http.HttpResponse<String> response = httpClient.send(request, java.net.http.HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
        return JSONObject.parseObject(response.body());
    }


    private static SSLContext getTrustSSLContext() throws Exception {
        SSLContext context = SSLContext.getInstance("SSL");
        context.init(null, new X509TrustManager[]{new X509TrustManager() {

            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }}, new SecureRandom());
        return context;

    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用jdk1.8的OkHttpClient跳过SSL校验,我们可以通过自定义X509TrustManager来实现。 X509TrustManager是一个管理X.509证书信任的接口,我们可以在其中自定义验证逻辑。在我们需要跳过SSL校验时,我们可以实现一个自定义的X509TrustManager来信任所有的SSL证书。 具体步骤如下: 1. 创建一个继承X509TrustManager的类,例如TrustAllCertsTrustManager。 2. 在TrustAllCertsTrustManager的实现中,重写checkClientTrusted和checkServerTrusted方法,并在方法体中不做任何验证操作,直接返回。 3. 在创建OkHttpClient实例时,通过SSLContext的init方法,传入TrustAllCertsTrustManager来绕过SSL校验。 示例代码如下: ```java import javax.net.ssl.*; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; public class TrustAllCertsTrustManager implements X509TrustManager { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // 不做任何验证操作 } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // 不做任何验证操作 } public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } public class Main { public static void main(String[] args) { try { // 创建TrustManager数组,只包含我们自定义的TrustAllCertsTrustManager TrustManager[] trustAllCerts = new TrustManager[] { new TrustAllCertsTrustManager() }; // 获取默认的SSLContext实例 SSLContext sslContext = SSLContext.getInstance("TLS"); // 初始化SSLContext实例,传入自定义的TrustManager数组,绕过SSL校验 sslContext.init(null, trustAllCerts, null); // 创建OkHttpClient实例 OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager)trustAllCerts[0]) .hostnameVerifier((hostname, session) -> true) .build(); // 使用client发送请求... } catch (Exception e) { e.printStackTrace(); } } } ``` 通过以上步骤,我们可以在jdk1.8的OkHttpClient中成功跳过SSL校验,但需要注意,在任何生产环境下,都不建议跳过SSL校验,这可能会导致安全漏洞。仅在特殊情况下使用,并确保在合适的时机恢复正常的SSL校验机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值