如何解决HTTPS请求报错sun.security.validator.ValidatorException: PKIX path building failed

这篇具有很好参考价值的文章主要介绍了如何解决HTTPS请求报错sun.security.validator.ValidatorException: PKIX path building failed。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在Java中进行网络请求时出现"sun.security.validator.ValidatorException: PKIX path building failed"错误通常是由于SSL证书验证失败引起的。这种错误可能由以下几种原因导致:

1、证书链不完整或证书不受信任: Java使用TrustStore来验证SSL证书的有效性。如果服务器使用的SSL证书不在Java TrustStore中,或者证书链不完整,就会导致PKIX路径构建失败。

2、证书过期: 如果服务器的SSL证书已经过期,Java会拒绝建立与该服务器的安全连接,从而导致PKIX路径构建失败。

3、证书主题名称与服务器域名不匹配: SSL证书通常与特定的域名相关联。如果SSL证书的主题名称与服务器的域名不匹配,Java会认为连接不安全而拒绝连接,从而导致PKIX路径构建失败。

下面我提供了两种解决方案:

1、禁用SSL证书验证
2、证书添加Java信任库
3、手动创建信任库 - 推荐
4、JVM设置信任库

建议使用第三种方式,灵活,证书过期可以不用重新部署应用。

报错背景

代码如下就几行

       String requestUrl = "https://subconverter.hladder.xyz/version";
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.exchange(requestUrl, HttpMethod.GET, null, String.class);
        String responseBody = response.getBody();
        System.out.println(responseBody);

为了确保这个url是可用的,在浏览器测试一下。可以看到是ok的。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http
接下来运行上面的java代码可以看到直接就报错了。为什么会出现下面的报错?因为Java对SSL证书的信任链有严格的要求。即使URL在浏览器中可访问,但如果SSL证书不在Java的信任库中,Java程序仍然可能会出现证书验证错误,导致无法建立安全连接。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http下面是提供了如何解决这个问题的方案。

1、禁用SSL证书验证

代码如下

// 创建一个RestTemplate实例
RestTemplate restTemplate = new RestTemplate();

// 要请求的URL
String requestUrl = "https://subconverter.hladder.xyz/version";

// 禁用SSL证书验证
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
    @Override
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    @Override
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
    }

    @Override
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
    }
}};

// 创建SSLContext,使用禁用SSL证书验证的TrustManager
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

// 设置全局默认的SSLSocketFactory,使RestTemplate使用禁用SSL证书验证的SSLContext
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

// 发送HTTP GET请求并接收响应
ResponseEntity<String> response = restTemplate.exchange(requestUrl, HttpMethod.GET, null, String.class);

// 获取响应体
String responseBody = response.getBody();

// 输出响应体内容
System.out.println(responseBody);

运行代码之后成功获取到了结果,并且没有报错。

sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http

2、证书添加到Java信任库

1、首先得下载服务器的SSL证书公钥文件。

我的服务器使用的是caddy做反向代理的,并且是用docker部署的,并且已经把caddy容器的/data目录映射到主机的/data/caddy/data,所以很容易就能找到公钥文件。

文件位置在/data/caddy/data/caddy/certificates/acme-v02.api.letsencrypt.org-directory下面。不会caddy的可以看下面的文章。Caddy 自动HTTPS 反向代理、重定向、静态页面 - docker版

下载.crt结尾的证书文件。我把它放到resources目录下。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http下面我将把证书添加到信任库文件中。

1、使用管理员身份运行cmd,进入到resources目录

2、执行keytool指令

-file后面的文件名修改为自己的。同时修改jdk安装目录下的cacerts文件的位置,注意需要绝对路径才行。

keytool -import -alias subconverter -file "E:\idea项目\sifanERP\h3yun-api\src\main\resources\subconverter.hladder.xyz.crt" -keystore "C:\Program Files\Java\jdk1.8.0_40\jre\lib\security\cacerts" -storepass changeit

命令解释

这条命令的含义是将一个证书文件导入到 Java 的信任库中。

  • keytool: 是 Java 提供的一个用于管理密钥和证书的命令行工具。
  • -import: 表示进行证书的导入操作。
  • -alias subconverter: 设置导入的证书的别名为 “subconverter”,以后可以通过这个别名来识别和管理该证书。
  • -file "E:\idea项目\sifanERP\h3yun-api\src\main\resources\subconverter.hladder.xyz.crt": 指定要导入的证书文件的路径。在这个例子中,证书文件位于指定的路径下。
  • -keystore "C:\Program Files\Java\jdk1.8.0_40\jre\lib\security\cacerts": 指定信任库文件的路径。在这个例子中,信任库文件位于指定的路径下。
  • -storepass changeit: 指定信任库的密码。在这个例子中,使用的是默认的信任库密码 “changeit”。

执行该命令后,系统会将指定的证书文件导入到 Java 的信任库中,并使用指定的别名存储。在这之后,您就可以在 Java 程序中使用该别名来引用这个证书。

jre中是有cacerts文件的。上面的治疗是往cacerts文件插入内容。cacerts这是个二进制文件。sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http3、在控制台粘贴上面的指令,回车。
下面会让你手动输入是否信任此证书,输入并回车。提示证书已添加到密钥库中并且没有任何报错才算成功。如果 有报错需要检查文件名和路径的问题。sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http4、测试
测试代码如下:

    public static void main(String[] args) throws Exception {
        TestNPTO testNPTO = new TestNPTO();
        testNPTO.test02();
    }

    void test02() throws Exception {
        String requestUrl = "https://subconverter.hladder.xyz/version";
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.exchange(requestUrl, HttpMethod.GET, null, String.class);
        String responseBody = response.getBody();
        System.out.println(responseBody);
    }

运行main方法。可以看到程序并没有报错了。

sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http
需要注意的是证书是有截止日期的,过期了需要重新导入。sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http5、证书过期了如何再次导入

需要先删除过期的证书,再执行上面的导入指令即可。

6、如何从信任库中删除指定的证书

根据别名删除证书。下面的指令替换成自己的别名和信任库的路径。

keytool -delete -alias subconverter -keystore "C:\Program Files\Java\jdk1.8.0_40\jre\lib\security\cacerts" -storepass changeit

删除成功时并不会有任何提示。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http验证证书已经被删除,同样的方法有证书不会报错,删掉证书又报错了。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http直接修改 Java 信任库的方式存在一些潜在的缺点:

1、系统依赖性: 修改 Java 信任库需要对目标系统具有足够的权限。在某些情况下,可能需要以管理员或超级用户身份才能执行此操作。

2、全局影响: 修改 Java 信任库是全局性的操作,会影响到整个 Java 运行时环境的安全性。如果添加了不受信任的证书或者不当地修改了信任库,可能会导致安全风险。

3、维护困难: 直接修改 Java 信任库可能会导致维护困难,特别是在多个环境或团队合作的情况下。由于信任库的修改是全局性的,因此需要确保对所有系统和开发人员都能够进行相同的修改。

4、安全性问题: 如果不小心添加了恶意证书或者不受信任的证书,可能会导致安全漏洞。因此,在修改信任库时需要格外小心,确保只添加了可信任的证书。
5、不利于团队开发:因为jdk是安装在本地的,java信任库也是在自己电脑上,很难进行管理。

keytool 工具是干嘛的,是谁提供的

keytool 工具是一个用于管理密钥库和证书的 Java 工具。它是 Java 开发工具包(JDK)的一部分,由 Oracle Corporation 提供。

keytool 主要用于以下几个方面:

  1. 生成密钥对和证书请求: keytool 可以生成公钥/私钥对,并创建证书请求(CSR),用于向证书颁发机构(CA)请求签发数字证书。
  2. 导入和导出证书: keytool 可以用于导入和导出 X.509 证书。您可以使用它从证书文件中导入证书到密钥库中,或者导出密钥库中的证书到文件中。
  3. 管理密钥库: keytool 可以用于创建、查看、更新和删除密钥库中的条目,例如密钥对、证书、证书链等。
  4. 管理信任库: keytool 可以用于管理 Java 的信任库,包括添加、删除和查看信任库中的受信任证书。

下面出现其他的解决方案,用来解决上面的问题。

3、手动创建信任库-添加证书 - 推荐

既然使用Java的信任库有诸多缺点,那么使用自己创建的信任库就没有那么多问题了。

1、创建信任文件并导入证书。注意修改证书路径为自己的。

keytool -import -file "E:\idea项目\sifanERP\h3yun-api\src\main\resources\subconverter.hladder.xyz.crt" -alias subconverter -keystore "E:\idea项目\sifanERP\h3yun-api\src\main\resources\mycacerts.jks"

命令解释

这个命令使用 keytool 工具来将指定的证书文件导入到一个 Java Keystore (JKS) 格式的信任库中。以下是各个参数的解释:

  • -import: 表示执行导入操作。
  • -file "E:\idea项目\sifanERP\h3yun-api\src\main\resources\subconverter.hladder.xyz.crt": 指定要导入的证书文件的路径。在这个命令中,证书文件的路径是 “E:\idea项目\sifanERP\h3yun-api\src\main\resources\subconverter.hladder.xyz.crt”。
  • -alias subconverter: 指定别名,用于标识导入的证书。在后续操作中,可以使用这个别名来引用这个证书。
  • -keystore "E:\idea项目\sifanERP\h3yun-api\src\main\resources\mycacerts.jks": 指定要导入的目标 keystore 文件的路径。在这个命令中,指定了一个名为 “mycacerts.jks” 的 keystore 文件,路径为 “E:\idea项目\sifanERP\h3yun-api\src\main\resources”。

使用管理员打开CMD,运行上面的指令,运行过程中会提示需要设置信任库的密码。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http为了方便记忆,密码设置为和Java信任库一致,也就是changeit当然也可以随便自己设置一个,但是得记住,因为需要用到密码才能使用这个信任库。

这个信任库是可以导入多个证书的。添加其他的证书时需要输入密码。下面是添加相同的证书它不让看看就好,添加其他证书也是上面一样的指令。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http2、使用自己创建的信任证书

为了测试,我已经删除了Java信任库中的证书。

此时运行test2方法是报错的。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http
下面是使用自己创建的信任证书的方式,方法名为我用test3。

代码如下:

    public static void main(String[] args) throws Exception {
        TestNPTO testNPTO = new TestNPTO();
        testNPTO.test03();
    }

    void test03() throws Exception {
        // 证书文件路径
        // 获取资源文件的输入流
        InputStream inputStream = this.getClass().getResourceAsStream("/mycacerts.jks");
        // 证书密码 - 自己设置的密码
        String certificatePassword = "changeit";

        // 加载证书文件
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(inputStream, certificatePassword.toCharArray());
        inputStream.close();

        // 创建 TrustManagerFactory 并初始化
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);

        // 获取 TrustManager
        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();

        // 使用自定义的 TrustManager 来实现证书验证
        TrustManager customTrustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) {
                // 实现客户端证书验证的逻辑,此处留空,因为我们是客户端
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) {
                // 实现服务器证书验证的逻辑,此处留空,因为我们已经在 KeyStore 中加载了特定证书
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        };

        // 将自定义的 TrustManager 添加到 TrustManager 数组中
        TrustManager[] customTrustManagers = new TrustManager[trustManagers.length + 1];
        System.arraycopy(trustManagers, 0, customTrustManagers, 0, trustManagers.length);
        customTrustManagers[trustManagers.length] = customTrustManager;

        // 创建 SSLContext 并初始化
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, customTrustManagers, null);

        // 使用 SSLContext 来创建 SSLSocketFactory
        SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        // 创建 RestTemplate
        RestTemplate restTemplate = new RestTemplate();

        // 设置自定义的 SSLSocketFactory
        restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory() {
            @Override
            protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
                if (connection instanceof HttpsURLConnection) {
                    ((HttpsURLConnection) connection).setSSLSocketFactory(sslSocketFactory);
                }
                super.prepareConnection(connection, httpMethod);
            }
        });

        // 发起 HTTPS 请求
        String requestUrl = "https://subconverter.hladder.xyz/version";
        ResponseEntity<String> response = restTemplate.exchange(requestUrl, HttpMethod.GET, null, String.class);
        String responseBody = response.getBody();
        System.out.println(responseBody);
    }

运行test3,看看效果,可以看到test3成功的。sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http为了使用方便可以把上面的restTemplate封装成一个Component。为了更灵活使用可以把mycacerts.jks放在OSS中或数据库等其他地方,方便证书过期而不需要重新进行系统部署。甚至可以把创建jks也用代码实现,在OSS上只用放证书就行。

下面是对RestTemplate类的封装,Bean的名称为customRestTemplate,如果mycacerts.jks是远程加载的,加载时只需更新下customRestTemplate组件就行。


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.*;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.security.KeyStore;
import java.security.cert.X509Certificate;

@Configuration
public class RestTemplateConfiguration {

    @Bean(name = "customRestTemplate")
    public RestTemplate customRestTemplate() throws Exception {
        // 证书文件路径
        // 获取资源文件的输入流
        InputStream inputStream = this.getClass().getResourceAsStream("/mycacerts.jks");
        // 证书密码 - 自己设置的密码
        String certificatePassword = "changeit";

        // 加载证书文件
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(inputStream, certificatePassword.toCharArray());
        inputStream.close();

        // 创建 TrustManagerFactory 并初始化
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);

        // 获取 TrustManager
        TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();

        // 使用自定义的 TrustManager 来实现证书验证
        TrustManager customTrustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) {
                // 实现客户端证书验证的逻辑,此处留空,因为我们是客户端
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) {
                // 实现服务器证书验证的逻辑,此处留空,因为我们已经在 KeyStore 中加载了特定证书
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        };

        // 将自定义的 TrustManager 添加到 TrustManager 数组中
        TrustManager[] customTrustManagers = new TrustManager[trustManagers.length + 1];
        System.arraycopy(trustManagers, 0, customTrustManagers, 0, trustManagers.length);
        customTrustManagers[trustManagers.length] = customTrustManager;

        // 创建 SSLContext 并初始化
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, customTrustManagers, null);

        // 使用 SSLContext 来创建 SSLSocketFactory
        SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        // 创建 RestTemplate
        RestTemplate restTemplate = new RestTemplate();

        // 设置自定义的 SSLSocketFactory
        restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory() {
            @Override
            protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
                if (connection instanceof HttpsURLConnection) {
                    ((HttpsURLConnection) connection).setSSLSocketFactory(sslSocketFactory);
                }
                super.prepareConnection(connection, httpMethod);
            }
        });
        return restTemplate;
    }
}

下面对customRestTemplate的使用测试

代码如下;

    @Resource
    private RestTemplate customRestTemplate;

    @Test
    void test04() throws Exception {
        String requestUrl = "https://subconverter.hladder.xyz/version";
        ResponseEntity<String> response = customRestTemplate.exchange(requestUrl, HttpMethod.GET, null, String.class);
        String responseBody = response.getBody();
        System.out.println(responseBody);
    }

    @Test
    void test05() throws Exception {
        String requestUrl = "https://subconverter.hladder.xyz/version";
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.exchange(requestUrl, HttpMethod.GET, null, String.class);
        String responseBody = response.getBody();
        System.out.println(responseBody);
    }

测试结果如下面两张图,使用customRestTemplate的test04方法是OK的,而test05报错。测试成功。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,httpsun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http
注意:证书过期需要重新搞一下自己的信任库。

4、JVM参数设置信任库

这个方案也是需要手动创建信任库的,创建方法在第三个方案里面。假设现在已经创建好了信任库。名称为mycacerts.jks位于resources目录下。

1、打开 - 修改运行配置Edit Run Configuration

sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http
添加JVM参数。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http
填入参数,注意:信任库的位置填自己的。

-Djavax.net.ssl.trustStore="E:\idea项目\sifanERP\h3yun-api\src\main\resources\mycacerts.jks" -Djavax.net.ssl.trustStorePassword=changeit

点击ApplyOK

2、运行测试一下。

可以看到运行也是ok的,jvm的参数看到加上了的。

sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http当然我种方式也是有弊端的,就是证书过期需要重新部署应用。

踩坑

maven打包后报错Invalid keystore format

我先执行maven的打包package再执行代码就会报错
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http报错的代码

keyStore.load(inputStream, certificatePassword.toCharArray());

是由于 Maven 的资源过滤导致的文件格式变化而引起的。对于二进制文件(如 .jks),进行文本过滤可能会破坏文件的格式,导致加载失败。

解决这个问题的方法之一是告诉 Maven 不要对 .jks 文件进行过滤。可以在 Maven 的 pom.xml 文件中配置资源过滤的排除规则,确保 .jks 文件不会被过滤。

1、方案1 -推荐
在resources目录下新建一个目录jks,把jks文件全放jks目录下面去,同时这样也有助于管理jks文件。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http

Maven 会将资源文件复制到target/classes目录中,但是它只会对src/main/resources目录下的文件进行过滤,不会对src/main/resources目录下的文件夹进行过滤。

此时重新打包看下效果。可以看到打包过后并没有报错。

sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http2、方案2
在pom.xml文件中进行如下配置:作用是maven过滤时忽略.jks结尾的文件。注意:需要同时写上过滤哪些和不过滤那些,最好写在父项目的pom.xml中。我建议使用方案1是最佳的。

<build>
    <!-- Maven 构建配置 -->
    <resources>
                    <resource>
                <directory>src/main/resources</directory>
                <!--引入所需环境的配置文件-->
                <filtering>true</filtering>
                <includes>
                    <include>application.yml</include>
                    <include>application.yaml</include>
                    <include>application.properties</include>
                    <include>bootstrap.yml</include>
                    <include>bootstrap.yaml</include>
                    <include>bootstrap.properties</include>
                </includes>
            </resource>
            <resource>
                <!-- 资源文件目录 -->
                <directory>src/main/resources</directory>
                <!-- 禁用对所有资源文件的过滤操作 -->
                <filtering>false</filtering>
                <!-- 包含所有类型的资源文件 -->
                <includes>
                    <include>*.jks</include>
                </includes>
            </resource>
        </resources>
    </resources>
</build>

测试结果也是没有问题的。
sun.security.validator.validatorexception: pkix path building failed: sun.se,https,网络协议,http文章来源地址https://www.toymoban.com/news/detail-849799.html

到了这里,关于如何解决HTTPS请求报错sun.security.validator.ValidatorException: PKIX path building failed的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • sun.security.validator.ValidatorException: PKIXpath building failed: sun.security.provider,javax.net

    sun.security.validator.ValidatorException: PKIXpath building failed: sun.security.provider,javax.net

    报错信息: 问题描述: 在java代码中调用其他项目接口,发起的是https请求。报错信息说找不到有效证书路径。 问题解决: 信任所有SSL证书 1、新建一个SslUtil类 2、在HttpUtil工具类中修改代码 忽略HTTPS请求的SSL证书代码,必须在openConnection之前调用 解决方案参考文章https://de

    2024年02月08日
    浏览(8)
  • 关于解决驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“sun.security.validator.ValidatorException:

    首先 如果你是在访问一个网站,可以通过可以通过导入证书的方式解决该问题。或者跳过ssl证书验证。这些操作步骤,其他博主已经写的非常详细了。在这里不做赘述。 如果你只是单纯链接一个本地数据库,却莫名其妙的出现了 驱动程序无法通过使用安全套接字层(SSL)加密

    2024年02月04日
    浏览(10)
  • javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building f

    原因:这是SSL证书请求问题。 原代码 报错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 修改代码:新增一个方法,忽略主机名称验证 在原代码处调

    2024年02月04日
    浏览(8)
  • https请求报错unable to find valid certification path to requested target解决

    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封装请求         HttpURLConnection请求         RestTemplate请求

    2024年02月08日
    浏览(45)
  • 证书异常导致:javax.net.ssl.SSLHandshakeException: sun.security.validator

    证书异常导致:javax.net.ssl.SSLHandshakeException: sun.security.validator

            当我们应用程序 访问设有https证书的服务 时,若 JRE未安装指定证书 则会提示标题的报错,此时有 两种方式 解决该问题:        按照实际场景,可从信息科、网络处等部门协调获取证书,也可以直接从安装证书的电脑上,通过浏览器下载证书,本文介绍后一种

    2024年01月17日
    浏览(10)
  • HTTPS 之 请求头缺少HTTPOnly和Secure属性解决方案

    1.如果使用php 修改 php.ini 的 session.cookie_httponly 和 session.cookie_secure 为 1,重启php 2.如果使用nginx 3.直接在代码响应头中添加这两个标志 4.使用springboot

    2024年02月15日
    浏览(10)
  • MINIO 配置https报错:x509:cannot validate certificate【已解决】

    MINIO 配置https报错:x509:cannot validate certificate【已解决】

    为MINIO配置https时,首先按官方要求官网描述(How to secure access to MinIO server with TLS),将TLS的公私钥放到:{{HOME}}/.minio/certs 里。 注意: 私钥需要命名为:private.key 公钥需要命名为:public.crt (如果公钥是以pem格式结尾,可直接改为crt格式) 但配置完成后会遇到如下错误,x509:c

    2024年02月14日
    浏览(47)
  • 【idea工具报错】程序包sun.misc不存在 的问题如何解决

    【idea工具报错】程序包sun.misc不存在 的问题如何解决

    【idea工具报错】程序包sun.misc不存在 的问题如何解决 idea工具出现下面这个报错 :   java: 程序包sun.misc不存在  赤裸裸的报错,但是idea在编译代码 build的时候就报上面这个错误。 先说我的解决办法吧: 上面第3步这里全部改成jdk1.8的配置,如下图:   我本机器安装了多个

    2024年02月12日
    浏览(21)
  • (已解决)PKIX path building failed: sun.security.provider.certpath

    问题描述 :电脑在开启抓包软件之后,如 proxyman 或 Charles ,JDK 不信任抓包软件颁发的证书,在请求 HTTPS 时报错。 解决方法 :让Java信任抓包软件颁发的证书。即先将根证书拷贝到 Java 中的根证书信任库中,然后使用 keytool 工具使配置生效。 到此结束

    2024年02月11日
    浏览(7)
  • https请求报错block:mixed-content问题的解决办法

    本文将深入探讨HTTPS请求中出现的block:mixed-content错误,解释这一错误的含义、产生原因,并给出相应的解决方法。通过本文,读者将能够了解如何有效地处理这一常见的网页安全问题。 当用户在通过HTTPS协议访问网页时,如果网页中尝试通过HTTP协议加载资源(如图片、脚本、

    2024年04月26日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包