PKIX path building failed(Https安全认证)

本文指导用户通过访问支付宝网站,导出CA证书并正确导入到Java环境,解决PKIX路径构建失败的问题。

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

    郁闷,这个问题网络上还找不到很类似的情况,不过当时想肯定和CA证书是有关系的,最后发现这个结论还是有用的,进入解决第二难的步骤:

1.    访问https://www.aplipay3.net

2.    IE自动弹出安全警报界面,点击“查看证书”

3.    在证书界面,点击“详细信息”,“复制到文件”

4.    在证书导出向导界面,点击“DER编码二进制X.509”

5.    导出文件为alipay.cer

6.    将alipay.cer拷贝到D:\Program Files\Java\jre1.5.0\lib\security,而不是D:\Program Files\Java\jdk1.5.0\jre\lib\security(这个可能和Eclipse的环境设置也有关系)

7.    然后用KeyTool工具将alipay.cer导入D:\Program Files\Java\jre1.5.0\lib\security\目录下的cacert文件(注意而不是D:\Program Files\Java\jdk1.5.0\jre\lib\security目录下的,这个可能和Eclipse的环境有关)

8.    再一次执行程序,哈哈哈哈哈哈,搞定,终于得到了支付宝返回给我的可爱的XML数据流

在 Eclipse 中遇到 `PKIX path building failed` 的 SSL 错误通常表明 Java 无法建立到目标服务器的可信证书路径。这可能是由于缺少受信任的根证书或中间证书导致的。以下是几种解决此问题的方法: ### 手动导入缺失的证书到 Java Keystore 1. 获取目标服务器的 SSL 证书,可以使用浏览器访问相关网站并导出证书。 2. 使用 `keytool` 命令将证书添加到 Java 的信任库中: ```bash keytool -import -alias <alias_name> -file <certificate_file> -keystore <path_to_jre>/lib/security/cacerts ``` 默认密码为 `changeit`。 ### 更换 JDK 发行版 如果使用的是 Oracle JDK,并且遇到了与证书路径相关的已知问题,可以尝试切换至 OpenJDK,因为后者通常不会受到相同问题的影响[^2]。 ### 配置 Eclipse 使用特定的信任库 可以在启动 Eclipse 时通过命令行参数指定自定义的信任库: ```bash eclipse -vmargs -Djavax.net.ssl.trustStore=<path_to_truststore> -Djavax.net.ssl.trustStorePassword=<password> ``` ### 忽略 SSL 证书验证(仅限开发环境) 对于开发和测试目的,可以选择忽略 SSL 证书验证错误。请注意,这种方法不适合生产环境,因为它会降低安全性。可以通过编写自定义的 `TrustManager` 来实现这一目标: ```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()); // 禁用主机名验证 HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true); ``` 请谨慎使用上述代码片段,确保它只用于开发阶段。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值