![]() |
1
4
对你的问题的简短回答,即特别信任所有证书,将使用 TrustAllStrategy 然后这样做:
然而。。。无效证书可能不是您的主要问题。握手失败的原因有很多,但根据我的经验,这通常是由于SSL/TLS版本不匹配或密码套件协商失败造成的。这并不意味着ssl证书是“坏的”,它只是服务器和客户机之间的不匹配。使用类似wireshark的工具,您可以准确地看到握手失败的地方。( more on that ) 虽然wireshark可以很好地看到它在哪里失败,但它不会帮助您想出解决方案。过去每当我调试握手失败时,我都会发现这个工具特别有用: https://testssl.sh/ 您可以将该脚本指向任何失败的网站,以进一步了解该目标上可用的协议以及客户机建立成功握手所需支持的内容。它还将打印有关证书的信息。 例如(仅显示testsl.sh输出的两个部分):
因此,使用这个输出,我们可以看到,如果您的客户机只支持SSLv3,那么握手将失败,因为服务器不支持该协议。协议提供不太可能出现问题,但您可以通过获取启用协议列表来仔细检查Java客户端的支持。您可以从上面的代码段提供sslconnectionsocketFactory的重写实现,以获取启用/支持的协议和密码套件的列表,如下所示( SSLSocket )以下内容:
当密码套件协商失败时,我经常会遇到握手失败。要避免此错误,您的客户端支持的密码套件列表必须至少包含一个与服务器支持的密码套件列表中的密码套件匹配的项。 如果服务器需要基于AES256的加密套件,您可能需要Java加密扩展(JCE)。这些图书馆是国家限制的,因此它们可能不能为美国以外的人使用。 有关密码限制的更多信息,如果您感兴趣: https://crypto.stackexchange.com/questions/20524/why-there-are-limitations-on-using-encryption-with-keys-beyond-certain-length |
![]() |
2
0
我认为你所指的职位与需要做的工作非常接近。您是否尝试过类似的操作:
我没有尝试过这个代码,但希望它可以工作。 干杯 |
![]() |
3
0
如果您可以使用其他开源库,比如
我使用下面的netty版本来信任具有上述代码的任何证书:
|
![]() |
4
0
我认为@nmornor的答案非常接近目标。除此之外,我还将明确地
|
![]() |
5
0
你也可以用核心JDK来实现,但是IIRC、HTTPClient也允许你设置SSL套接字工厂。 工厂定义并使用与信任管理器一起构造的SSL上下文。正如上面的文章所示,该管理器不会简单地验证cert链。 您还需要一个hostnameverifier实例,该实例还可以选择忽略cert hostname与URL主机(或IP)的潜在不匹配。否则,即使证书签名者被盲目信任,它仍然会失败。 我曾经将许多客户机堆栈转换为“接受自签名”,在大多数堆栈中这很容易。更糟糕的情况是,第三方库不允许选择SSL套接字工厂实例,而只允许选择其clasname。在这种情况下,我使用一个threadlocalsslsocketfactory,它不拥有任何实际的工厂,但只需查找threadlocal,以找到上层stackframes(您可以控制)准备的一个。当然,只有当第三方库没有在不同的线程上进行工作时,这才有效。我知道HTTP客户机可以被告知使用特定的SSL套接字工厂,所以这很容易。 还要花时间阅读JSSE文档,这是完全值得花时间阅读的。 |