https请求报错unable to find valid certification path to requested target解决

        在Java项目中请求HTTPS时,可能会遇到 "unable to find valid certification path to requested target" 错误。这个错误通常是由于SSL证书问题引起的。要解决此问题,可以尝试以下方法

1.忽略SSL验证

        OkHttpClient封装请求

public static OkHttpClient getUnsafeOkHttpClient() {
        try {
            // 创建一个信任所有证书的TrustManager
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new 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];
                        }
                    }
            };

            // 创建一个不验证证书的 SSLContext,并使用上面的TrustManager初始化
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // 使用上面创建的SSLContext创建一个SSLSocketFactory
            javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.hostnameVerifier((hostname, session) -> true);
            builder.readTimeout(1, TimeUnit.MINUTES);

            return builder.build();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    public static void main(String[] args) throws Exception {
        
        // 发送请求
        Request request = new Request.Builder()
                .url("https://example.com")
                .build();

        Response response = getUnsafeOkHttpClient().newCall(request).execute();
        System.out.println(response.body().string());
    }
        CloseableHttpClient请求
public static void main(String[] args) throws Exception {
        // 创建SSL上下文,忽略证书验证
        SSLContextBuilder sslContextBuilder = SSLContexts.custom().loadTrustMaterial((chain, authType) -> true);
        SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build(), NoopHostnameVerifier.INSTANCE);


        // 创建 CloseableHttpClient 对象
        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(sslSocketFactory)
                .build();

        // 创建 HttpGet 对象,并设置请求URL
        HttpGet httpGet = new HttpGet("https://lmg.jj20.com/up/allimg/4k/s/02/2109250006343S5-0-lp.jpg");

        // 设置请求头参数
        httpGet.setHeader("User-Agent", "Mozilla/5.0");

        // 发送请求,获取响应
        HttpResponse response = httpClient.execute(httpGet);

        // 获取响应实体
        HttpEntity entity = response.getEntity();

        // 读取响应内容
        String responseBody = EntityUtils.toString(entity);

        // 输出响应
        System.out.println("Response Code: " + response.getStatusLine().getStatusCode());
        System.out.println("Response Body: " + responseBody);

        // 关闭httpClient
        httpClient.close();
    }

        HttpURLConnection请求

//忽略SSL验证
    public static void ignoreSSL() throws NoSuchAlgorithmException, KeyManagementException {
        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManager[] trustManagers = new TrustManager[]{new X509TrustManager() {
            @Override
            public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {}

            @Override
            public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {}

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        }};
        sslContext.init(null, trustManagers, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
    }

    public static void main(String[] args) throws Exception {
        ignoreSSL();
        // 创建URL对象
        URL url = new URL("https://lmg.jj20.com/up/allimg/4k/s/02/2109250006343S5-0-lp.jpg");

        // 打开连接
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        // 设置请求头参数
        connection.setRequestMethod("GET");
        connection.setRequestProperty("User-Agent", "Mozilla/5.0");

        // 发送请求
        int responseCode = connection.getResponseCode();

        // 读取响应
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line;
        StringBuilder response = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            response.append(line);
        }
        reader.close();

        // 输出响应
        System.out.println("Response Code: " + responseCode);
        System.out.println("Response Body: " + response.toString());

        // 关闭连接
        connection.disconnect();
    }

        RestTemplate请求

public static void ignoreSSL() throws NoSuchAlgorithmException, KeyManagementException {
        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManager[] trustManagers = new TrustManager[]{new X509TrustManager() {
            @Override
            public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {}

            @Override
            public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) {}

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        }};
        sslContext.init(null, trustManagers, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
    }

    public static void main(String str[]) throws Exception{
        ignoreSSL();
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.getForEntity("https://lmg.jj20.com/up/allimg/4k/s/02/2109250006343S5-0-lp.jpg", String.class);
        System.out.println(response.getBody());
    }

2.添加证书到本地证书库
  • 获取证书,首先确保您访问的HTTPS网站具有有效的SSL证书。可以通过浏览器访问该网站并查看并导出证书。

 

  • 导入SSL证书:将SSL证书导入到Java的信任存储库中。可以使用keytool命令行工具执行此操作。运行以下命令将证书导入到默认的JDK信任存储库中

  1. keytool -import -alias alias_name -keystore path_to_jdk_cacerts -file path_to_certificate
    
    -- alias_name 证书指定的别名
    -- path_to_jdk_cacerts是JDK信任存储库的路径,默认路径为$JAVA_HOME/jre/lib/security/cacerts,
    -- path_to_certificate是下载的SSL证书的路径

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个错误通常是由于Java客户端无法验证SSL证书导致的。您可以尝试以下两种方法来解决这个问题: 1.导入SSL证书 您可以从浏览器中导出SSL证书,然后将其导入到Java的证书存储中。具体步骤如下: 1)在浏览器中打开HTTPS网站,并单击浏览器地址栏中的锁图标。 2)单击“证书”按钮,然后选择“详细信息”。 3)单击“复制到文件”按钮,然后按照向导的指示将证书导出到文件中。 4)在Java的证书存储中导入证书。您可以使用以下命令将证书导入到Java的证书存储中: ```shell keytool -import -alias your_alias -keystore $JAVA_HOME/jre/lib/security/cacerts -file your_certificate.crt ``` 其中,your_alias是您为证书指定的别名,your_certificate.crt是您导出的证书文件。 2.禁用SSL验证 如果您不想导入SSL证书,也可以通过禁用SSL验证来解决这个问题。但是,这种方法会降低安全性,因此不建议在生产环境中使用。您可以使用以下代码禁用SSL验证: ```java TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) { } public void checkServerTrusted(X509Certificate[] certs, String authType) { } }}; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值