一种解决javax.net.ssl.SSLHandshakeException: Chain validation failed异常的临时性解决方案

使用HttpURLConnection时,如果证书出问题,就可能抛出SSLHandshakeException的错误,这里可以通过设置HttpURLConnection信任所有证书的办法来临时解决这个问题。

private static void trustAllHosts() {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[] {};
            }
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException
            {
                Log.i("skyapp", "checkClientTrusted");
            }
            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                Log.i("skyapp", "checkServerTrusted");
            }
        } };
        // Install the all-trusting trust manager
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在openUrlConnection之前调用上述代码即可。

在 Android 中处理 "javax.net.ssl.SSLHandshakeException: Chain validation failed" 错误,可以尝试以下几个步骤: 1. 确认证书是否已过期或被撤销,并使用正确的证书。 2. 确保证书链完整且证书签名受信任。 3. 确认服务器已正确配置 SSL/TLS。 4. 更新本地证书存储,添加缺少的根证书或中间证书。 如果以上步骤都无法解决问题,你可以尝试禁用 SSL 证书验证,但这并不是一个安全的解决方案,因为它可能会导致中间人攻击。 在 Android 中禁用 SSL 证书验证需要使用自定义 TrustManager。可以创建一个自定义 TrustManager 类,重写它的 checkServerTrusted() 方法,并在该方法中始终返回正确的结果。然后创建一个 SSLContext 对象,并在其中设置自定义 TrustManager,最后将其用于创建 HttpsURLConnection 对象或 OkHttpClient。示例如下: ``` TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }; SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager)trustAllCerts[0]) .hostnameVerifier((hostname, session) -> true) .build(); ``` 请注意,这种方法会跳过证书验证,存在安全风险。因此,建议仅在测试或开发环境中使用。在生产环境中,应使用有效的 SSL 证书并正确配置服务器。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值