异常: javax.net.ssl.SSLHandshakeException: PKIX path building failed: SunCertPathBuilderException

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

概述

当我们使用 java.net.URL 或者 org.jsoup.Jsoup 等工具,去获取网页信息的时候,可能会因为证书原因报错:
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


异常: javax.net.ssl.SSLHandshakeException: PKIX path building failed: SunCertPathBuilderException,异常,ssl,.net,java

原因

这个错误通常是由于Java环境中 缺少证书或证书无效导致

如果操作系统根证书过期或者不完整,可能会导致这个错误出现,解决办法就是:更新操作系统根证书并重新启动计算机


**其它原因**
  • 如果是因为网络连接不稳定,也可能导致获取网页信息报错,可以检查网络连接是否正常,多试几次就行
  • 无URL访问权限或者URL错误无效,也可则可能会出现此错误

解决办法

方法一:Java实现禁用 SSL验证(慎用)
/**
     * 禁用SSL验证【注意:会禁用所有SSL验证,包括恶意攻击者可能使用的验证!!】
     * 
     * todo: 如果需要验证证书或主机名,需要自行实现相应的逻辑
     */
    public static void forbiddenCheckSslCertificate() {
        
        try {
            // 使用SSLContext类手动设置SSL证书验证
            SSLContext sslContext = SSLContext.getInstance("SSL");
            // X509TrustManager类用于信任所有证书
            sslContext.init(null, 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 new java.security.cert.X509Certificate[0];
                }
                
            }}, new SecureRandom());
            
            HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
            
            // HostnameVerifier 类用于信任所有主机名
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            });

        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            LogUtil.warn("execute exception = {}", e.getLocalizedMessage(), e);
        }
        
    }

【注意】:该方法会禁用所有 SSL验证,包括恶意攻击者可能使用的验证!
使用时只有在信任所有服务器并且没有其他解决方案时才应使用此方法!


方法二:更新 Java 的安全证书(Java环境中缺少证书或证书无效的情况)

Java安装目录中找到 jre\lib\security 文件目录,然后从官方网站下载最新的Java安全证书,将其添加到 cacerts 文件中【注意将 cacerts 文件备份

具体步骤

  1. 找到电脑上的Java安装目录(默认情况下,在 C:\Program Files\JavaC:\Program Files (x86)\Java 目录中)

  2. 在Java目录下,进入 jre\lib\security 文件目录

  3. 备份 cacerts 文件(备份以防万一可恢复,这个目录存放当前的Java安全证书)

  4. 去官网下载最新的Java安全证书
    地址: https://www.oracle.com/java/technologies/javase-downloads.html
    在Oracle的Java SE下载页面上找到最新的Java安全证书进行下载

  5. 添加新的Java安全证书到 cacerts 文件目录中
    使用Java的 keytool 工具将下载好的新的Java安全证书添加到 cacerts 文件中。
    eg: 在终端中,跳转到 jre\lib\security 目录,然后运行以下命令:

    keytool -import -alias mycert -file <这里填入下载好的需要添加的Java安全证书文件路径> -keystore cacerts
    

    这个过程中需要输入当前的 keystore 密码(默认为 changeit),然后输入 yes 添加新的证书。

    keystore 是Java中用于存储数字证书、私钥和公钥的安全存储区域。它是一个二进制文件,通常使用 Java keytool 工具进行创建和管理。在Java应用程序中,keystore 用于存储 SSL 证书、身份验证证书和加密密钥等敏感数据。可以使用Java的 SSL 套接字实现从 keystore 中加载数字证书以建立 SSL 连接。keystore 还可以用于数字签名和加密操作,以确保数据的完整性和安全性。在Java中,有两种类型的keystore

    • Java keystore(JKS)
    • PKCS12 keystore

    keystore 密码是用于保护 Java keystore 文件的密码。Java keystore 文件包含数字证书,私钥和公钥。在使用 keytool 工具添加或删除数字证书时,需要提供 keystore密码 以验证对keystore 文件的访问权限。默认情况下,Java keystore文件的密码为 changeit。当然如果在创建 keystore 文件时指定密码,则需要使用你制指定的密码。

  6. 重启Java应用程序测试是否已解决问题

【注意】:修改Java安全证书可能会影响其他Java应用程序的功能。所以,请做好备份,同时多测试!


方法三:更新操作系统根证书(操作系统根证书过期或不完整的情况)

如果操作系统根证书过期或者不完整,可能会导致这个错误出现。
更新操作系统根证书的具体操作流程可能因操作系统版本而异。通用的更新操作系统根证书的步骤如下:

  1. 打开 证书管理器
    • Windows操作系统中,可以通过打开cmd窗口(windows+R),输入certmgr.msc 回车打开 证书管理器
    • macOS操作系统中,通过打开 应用程序 文件夹,然后转到 实用工具 文件夹中的 钥匙串访问 应用程序来打开 钥匙串访问
  2. 导入新的根证书
    在 证书管理器 中,找到 可信任的 根证书颁发机构 文件夹,鼠标右键,选择【所有任务】 > 【导入】 选项。然后选择下载好的新的根证书文件,并按照向导中的说明完成导入
  3. 删除旧的根证书
    【证书管理器】中,找到旧的根证书,按照提示完成删除过程。
  4. 重启计算机
    重新启动计算机以确保更改生效。

【注意】:更新操作系统根证书可能会影响其他应用程序的功能。所以,请做好备份,同时多测试!文章来源地址https://www.toymoban.com/news/detail-743159.html

到了这里,关于异常: javax.net.ssl.SSLHandshakeException: PKIX path building failed: SunCertPathBuilderException的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 请求https报错证书校验失败(javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX

    项目中请求第三方https的URL,报错ssl证书校验失败 ssl校验失败有两种可能,一种是服务端ssl证书配置错误,一种是客户端请求的是非信任的https地址,客户端不信任该https的ssl证书。怀疑是使用了自签名证书,非各大厂提供签名证书 该问题有两种请求方案 手动下载ssl证书 (

    2024年02月03日
    浏览(68)
  • Java调用ssl异常,javax.net.ssl.SSLHandshakeException: No appropriate protocol

      现象:sqlserver 2017 安装在docker里,系统是mac 13,java 1.8.371运行java程序提示上面ssl错误,根据百度提供的方法,修改文件,重启程序搞定。 解决办法:java.security 找到这个文件修改保存 发现是jdk1.8版本导致SSL调用权限上有问题,新电脑装的jdk是jdk1.8.0_291,版本比较高。搜到

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

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

    2024年01月17日
    浏览(38)
  • 已解决javax.net.ssl.SSLHandshakeException: SSL握手异常的正确解决方法,亲测有效!!!

    已解决javax.net.ssl.SSLHandshakeException: SSL握手异常的正确解决方法,亲测有效!!! 目录 问题分析 场景描述 报错原因 解决思路 解决方法 总结  博主v:XiaoMing_Java 在开发涉及HTTPS通信的Java应用时, javax.net.ssl.SSLHandshakeException 是一个常见的问题,它发生在客户端与服务器尝试建

    2024年04月12日
    浏览(39)
  • java项目实现读写分离,项目连接Linux部署的数据库异常javax.net.ssl.SSLHandshakeException: No appropriate protocol

    1、对项目进行优化实现读写分离,项目启动时报错如下: Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) 原因:javax.net.ssl.SSLHandshakeException:没有适当的协议(协议被禁用或密码套件不合适) 2、bug解决:     注意: useSSL=f

    2024年02月04日
    浏览(51)
  • javax.net.ssl.SSLHandshakeException

    解决办法升级jdk版本或者修改jdk文件 1、对于服务器来说要支持域名并且不进行ssl证书校验,需要升级到jdk1.8的201版本及以上 2、修改…JavaJDKjrelibsecurity目录下java.security文件,添加下面语句到文件内容中

    2024年02月11日
    浏览(42)
  • Macos jdk ssl javax.net.ssl.SSLHandshakeException完美解决

    报了这么一个错误 javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake 网上一大把,测试不能用,谷歌了一下,发现少配置了一个环境变量。 System.setProperty(\\\"jdk.tls.useExtendedMasterSecret\\\", \\\"false\\\");//设置环境变量 /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/security/java.se

    2024年02月13日
    浏览(63)
  • javax.net.ssl.SSLHandshakeException: No appropriate protocol

    报错: 解释代码 这是一个Spring Boot应用程序的配置文件中的一行代码,用于设置数据库连接信息。具体解释如下: spring.datasource.url :这是Spring Boot中用于配置数据源URL的属性。 jdbc:mysql://ip:3306/dbuser :这是JDBC URL,用于指定数据库的类型(MySQL)、主机地址(ip)、端口号(

    2024年02月20日
    浏览(46)
  • 解决远程调用三方接口:javax.net.ssl.SSLHandshakeException报错

    最近在对接腾讯会议API接口,在鉴权完成后开始调用对方的接口,在此过程中出现调用报错:javax.net.ssl.SSLHandshakeException。 当你在进行https请求时,JDK中不存在三方服务的信任证书,导致出现错误javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败。

    2024年02月13日
    浏览(49)
  • Java调用Azure证书错误javax.net.ssl.SSLHandshakeException

    一、背景 Azure作为微软的公有云平台,提供了非常丰富的SDK和API让开发人员可以非常方便的调用的各项服务。公司业务需要,我们需要访问Azure上注册的应用程序,需要访问https地址 https://login.microsoftonline.com/​your-​​tenant-id 。 二、错误信息 简短报错信息:javax.net.ssl.SSLHa

    2024年02月06日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包