CertPathValidatorException:validity check failed

做的项目中调用微信支付二维码的时候报出以下异常:

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX path validation failed:java.security.cert.CertPathValidatorException:validity check failed

查找过相关的解决方案,大多都是证书相关,但是并没有解决我的这个问题,后来从

http://blog.youkuaiyun.com/u011148770/article/details/50593991这个博客看到:

“操作系统时间被修改了”

于是看了下跑项目的机子,时间确实不对,改正后可以正常显示二维码。

### 解决方案 当遇到 `sun.security.validator.ValidatorException: PKIX path building failed` 错误时,这通常意味着 Java 应用程序无法找到有效的证书链来验证服务器的身份[^1]。此问题可能由多种原因引起,包括但不限于: - **缺少必要的根证书**:Java 的信任库中未包含用于验证远程服务器身份的根证书。 - **时间不同步**:客户端和服务器之间的时间差异可能导致证书被认为无效[^2]。 #### 方法一:更新 JDK 中的信任库 如果问题是由于缺失的根证书引起的,则可以通过向本地 JDK 的信任库 (`cacerts`) 添加所需的 CA 证书来解决问题。具体操作如下所示: ```bash keytool -importcert -file /path/to/ca_certificate.crt -alias my_ca_alias -keystore $JAVA_HOME/jre/lib/security/cacerts ``` 默认情况下,`cacerts` 文件的密码为 `changeit`。执行上述命令后,重启应用程序使更改生效。 #### 方法二:同步系统时间和 NTP 设置 对于因时间戳不匹配而导致的有效性检查失败的情况,应确保开发环境中的日期和时间设置正确无误,并配置好网络时间协议 (NTP),以便自动保持与互联网标准时间源的一致性。 #### 方法三:忽略 SSL 验证(仅限于测试环境中) 在某些特定场景下,比如内部测试或调试阶段,可以考虑临时禁用 HTTPS 请求中的 SSL/TLS 验证机制。但这绝对不应该应用于生产部署! 对于基于 Apache HttpClient 发起 HTTP(S) 调用的应用来说,可通过自定义 `SSLContext` 来实现这一点: ```java // 创建一个接受所有主机名的HostnameVerifier HostnameVerifier allHostsValid = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; // 构建允许所有的SSL连接 try { SSLContext sslcontext = SSLContext.getInstance("TLS"); TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} @Override public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} @Override public X509Certificate[] getAcceptedIssuers() {return null;} }}; sslcontext.init(null, trustAllCerts, new java.security.SecureRandom()); HttpClients.custom().setSSLContext(sslcontext).setSSLHostnameVerifier(allHostsValid); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } catch (KeyManagementException e) { throw new RuntimeException(e); } ``` 请注意,在实际项目里应当谨慎处理安全相关逻辑,避免引入潜在的安全风险。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值