gpt4 book ai didi

java - 更改 Java SSL 客户端连接的启用协议(protocol),包括包装案例

转载 作者:行者123 更新时间:2023-12-03 21:40:16 25 4
gpt4 key购买 nike

我需要实现 Apache HttpClient SecureProtocolSocketFactory接口(interface)来创建不使用 SSLv2Hello 协议(protocol)的 SSL 套接字并进行 SSLv3 握手。来自 the documentation ,修改协议(protocol)列表的过程是调用 setEnabledProtocols SSLSocket .我相信我需要在创建它之后但在连接它之前执行此操作,因为连接会启动 SSL 握手并且它是我试图更改的 SSL 握手协议(protocol)。

这很好:而不是使用带参数context.getSocketFactory().createSocket(...)创建和连接套接字的重载然后我可以使用无参数重载来创建套接字,设置它然后自己连接它。问题是有another overload of createSocket() in SSLSocketFactory用 SSL 包装现有套接字,并立即启动握手,即我没有机会重新配置它。

所以为了涵盖那个案例,我想我必须扔掉 SSLSocket.setEnabledProtocols而是做一个

  • 修改我的SSLContext的协议(protocol)集,即 SSLSocketImpl用于配置自身。但是我看不到执行此操作的公共(public)接口(interface),因此我需要通过反射来更改它,这意味着假设类的私有(private)成员并且还可以访问内部类 ProtocolList .
  • 使用我的SSLContext只为获得 SSLEngine我可以配置它,然后使用它在套接字上实现我自己的 SSL。

  • 我对其中任何一个都不满意;我可能会倾向于反射,因为 Java 7+ 正在放弃 SSLv2Hello,所以如果将来类发生变化并且我的反射中断,那么这实际上不是问题。我有一个 SSLContext 的新实例已经用于自定义信任存储。

    我错过了什么吗 - SSLContext 上的公共(public)机制或 SSLSocketFactory设置这个?有没有更好、更清洁的方法来做到这一点?谢谢!

    在进一步调查中,我认为也不可能进行反射(reflection)。我一直在查看 JDK8 源代码,因为这是我必须手头的,而在 JDK6 源代码中 SSLSocket initialises itself from a static list ,而不是来自 SSLContextSSLContextSpi属性(property):
    enabledProtocols = ProtocolList.getDefault();

    以及 getDefault 后面的源字段是静态最终的,所以我也不能修改它:-(

    所以我的想法不多了。我仍然不热衷于重新实现 SSLSocket(2000 多行),所以我认为它回到了 setEnabledProtocols并希望我的 HTTPS 客户端永远不必协商与 SSL 的连接。

    最佳答案

    我遇到了非常相似的问题。
    我认为您可以将大多数问题分解为一个问题,为什么我们可以在自定义套接字工厂中覆盖启用的密码,但我们不能设置 getEnabledProtocols(): String[] 返回的协议(protocol)版本?
    或者更简单:
    如果您可以在 SSLContext 中设置启用的密码和协议(protocol)版本,您可以使用任何 HttpsConnection/SSLClient 和 SSLServerSocket 甚至库(Apache HttpClient,OKHttp,...),并确保您在 SSL 协议(protocol)版本和密码方面的安全要求是两人见面。
    不幸的是,大多数人在建立连接的时候就停下来了,安全性只是对他们的一个声明。

    关于java - 更改 Java SSL 客户端连接的启用协议(protocol),包括包装案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20457211/

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