gpt4 book ai didi

java - 仅针对一台特定服务器忽略 SSLHandshakeException

转载 作者:行者123 更新时间:2023-11-30 11:28:08 32 4
gpt4 key购买 nike

我需要忽略 PKIX 路径构建异常

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExc
ption: unable to find valid certification path to requested target

我知道如何通过编写自己的实现 X509TrustManager 的类来做到这一点,我总是从 isServerTrusted返回 true

但这相当广泛。我的代码将成为更大项目的一部分。我不希望其他一切都因我更换信托经理而受到影响。

我总是会连接到一个固定的域名,即“www.myws.com”。我只想忽略 SSLHandshakeException 仅用于连接到“www.myws.com”。

这样的事情可能吗?

最佳答案

There is little chance that the answers to 2 questions is going to be the same because I don't think the TrustMananger gets the domain name of the server at all.

实际上,信任管理器可以获得您所查找的主机名。不过,这取决于许多因素。

  • 我们假设您的客户端运行在 Java 7 上。

    如果您遵循与 this other answer 中相同的方法但使用 X509ExtendedTrustManager (在 Java 7 中引入,而不是普通的 X509TrustManager ),您将获得额外的重载方法,为您提供当前的 SSLSocketSSLEngine

    SSLContext使用 X509ExtendedTrustManager 初始化时使用这些方法实例,但不是普通的 X509TrustManager ,因此它必须在进行这些调用之前检查类型(请参阅本答案末尾的快速测试,基于 the code in that answer )。

    我不确定 API 在哪里指定了此行为。这个X509ExtendedTrustManager好像没有什么在 JSSE Reference Guide 中进行类型检查.确保使用扩展方法的一种方法是设置 enpoint identification algorithm (like HTTPS) in your SSLParameters ,但您需要对客户端代码及其使用的库进行一定程度的控制。 (这也是 Java 7 引入的特性。)

    来自SSLSocketSSLEngine在那里获得,你可以获得SSLSession和对等主机,因此您可以在那里执行检查。 (请注意,如果创建 SSLSocketSSLEngine 的库未使用将名称作为 String 传递的方法之一,而是传递了 InetAddress,则主机名可能与预期不完全匹配. 在这种情况下你也会失去 SNI。)

    然后您可以在默认 SSLContext 中使用这样的信任管理器(与 setDefault(...) )。

  • 如果不想影响默认SSLContext (此类调整的明智选择),您需要弄清楚您的客户端库如何为每个连接使用不同的客户端库。这完全取决于使用的是什么。

    对于传统的 URLConnection , 将其转换为 HttpsURLConnection并设置为 SSLSocketFactory作为您自定义的一个版本 SSLContext .


使用哪些方法取决于您是否实例化了 X509ExtendedTrustManagerX509TrustManager :

X509TrustManager customTm = new X509ExtendedTrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return finalTm.getAcceptedIssuers();
}

@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
System.out
.println("Current method: checkServerTrusted(chain, authType)");
finalTm.checkServerTrusted(chain, authType);
}

//@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType, Socket socket) throws CertificateException {
System.out
.println("Current method: checkServerTrusted(chain, authType, socket)");
finalTm.checkServerTrusted(chain, authType, socket);
}

//@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType, SSLEngine engine)
throws CertificateException {
System.out
.println("Current method: checkServerTrusted(chain, authType, engine)");
finalTm.checkServerTrusted(chain, authType, engine);
}

// Same for client-related methods.
};

关于java - 仅针对一台特定服务器忽略 SSLHandshakeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19005702/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com