【问题标题】:java unable to find valid certification path to requested targetjava无法找到请求目标的有效认证路径
【发布时间】:2021-06-27 10:55:49
【问题描述】:

这个问题已经被问过很多次了。

答案总是“将证书添加到信任库”。

我必须通过一个奇怪的代理服务器工作,它总是发送不同的自签名证书。 因此添加到信任库是不切实际的。

唯一的选择是禁用 SSL 证书验证。 我有这个代码,但它没有帮助:( 有什么建议吗?

(顺便说一句,我不关心安全性,我们在内部使用此代码进行测试)

@Slf4j
public class TrustAllX509TrustManager implements X509TrustManager {

    @SneakyThrows({ KeyManagementException.class,
        NoSuchAlgorithmException.class })
    public static void disableSslCertificateValidation() {
        log.debug("turning off SSL certificate validation");
        val sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null,
            new TrustManager[] { new TrustAllX509TrustManager() },
            new java.security.SecureRandom());
        HttpsURLConnection
            .setDefaultSSLSocketFactory(sslContext.getSocketFactory());
        HttpsURLConnection
            .setDefaultHostnameVerifier((string, ssls) -> true);
    }

    @Override
    public void checkClientTrusted(
        final java.security.cert.X509Certificate[] certs,
        final String authType) {
        // nothing to do here
    }

    @Override
    public void checkServerTrusted(
        final java.security.cert.X509Certificate[] certs,
        final String authType) {
        // nothing to do here
    }

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

【问题讨论】:

    标签: java ssl ssl-certificate


    【解决方案1】:

    看起来您正在使用 X509TrustManager 的自定义实现。我遇到了与您遇到的问题类似的问题,并通过使用不同类型的基础 TrustManager 解决了它。

    所以我所做的不是实现X509TrustManager,而是使用X509ExtendedTrustmanager 扩展了我的自定义信任管理器。示例见此处:UnsafeX509ExtendedTrustManager

    我发现 java 将 TrustManager 包装到 X509ExtendedTrustmanager 类型的自定义 TrustManager 中,如果它是 X509TrustManager 的实例,它不会像您在 sn-p 中所做的那样禁用所有检查。因此,使用 X509ExtendedTrustmanager 类型的自定义 TrustManager 应该可以解决我认为的问题。您可以尝试分享您的结果吗?

    【讨论】:

    • 看来 Java 仍然没有标准的 HTTP 通信方式,每个库的配置应该有所不同。对于 JAX-RS 客户端,必须在配置客户端时设置特定的 SSLContext。那里还有其他 HTTP/REST 客户端,也许每个客户端都有自己独特的方式。目前我被 AmazonHttpClient 困住了——在github.com/aws/aws-sdk-java/issues/2603 打开了一个问题
    • 感谢分享问题链接,查看您在 github 上分享的 stackstrace 我很确定使用 X509ExtendedTrustmanager 而不是 X509TrustManager 应该可以解决问题。你可以在哪里尝试?我可以分享一些示例代码 sn-ps
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 2015-02-13
    • 2019-10-15
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多