确定 Java 中 TLS 握手的 Diffie-Hellman“参数”长度

2024-03-13

我想与服务器建立 HTTPS 连接,如果我使用 非临时DH密钥交换,我想知道参数是什么 用于该连接。事实上,我并不关心它是否 是否短暂。

我正在寻找的是建立连接然后发出警告的能力 如果连接使用“弱”DH 参数。那是我吗 可以在连接时检查吗?或者是DH参数的集合(或者,更多 具体来说,length这些参数(以位为单位)定义为 密码套件本身?

例如,Qualys 社区线程有一个说明: SSLLabs 认为“弱”的密码套件(嗯,每个人都认为 他们很弱......他们只是有一个抱怨他们的公共工具):https://community.qualys.com/thread/14821 https://community.qualys.com/thread/14821

他们特别提到,例如TLS_DHE_RSA_WITH_AES_256_GCM_SHA384这是密码套件 0x9f 并提及 DH 参数。是那些 参数的参数被烘焙到密码套件中(这意味着它们是always1024 位)或者这是服务器的配置 那些密码套件由于特定的 DH 参数选择而较弱?

无论哪种情况,我都希望能够从 如果可能的话连接。有谁知道这是否可以做到 如何?

我已经编写了一些代码来尝试获取有关握手的信息,但我不断收到null对于我希望包含这些数据的对象。

SSLSocketFactory sf = ...;
Socket sock = new Socket();
sock.connect(address, timeout);

SSLSocket socket = (SSLSocket)sf.createSocket(sock, host, port, true);
socket.startHandshake();
SSLSession sess = socket.getHandshakeSession();

我本来希望sess此时将包含一些有关握手的有趣信息,但它是null。 javadoc 为startHandshake表示握手完成后会通知事件监听器。所以我尝试了这个:

SSLSocketFactory sf = ...;
Socket sock = new Socket();
sock.connect(address, timeout);

SSLSocket socket = (SSLSocket)sf.createSocket(sock, host, port, true);
socket.startHandshake();
// SSLSession sess = socket.getHandshakeSession();
SSLSession sess = socket.getSession(); // This forces the handshake to complete
sess = socket.getHandshakeSession();

... but sess还是null在此刻。 “真正的”SSLSession 确实存在,并为我提供了有关连接的信息,但“握手会话”似乎始终是null.

所以我尝试写一个HandshakeCompletedListener,事实上我确实得到了SSLSession,但它似乎与我可以从SSLSocket已经,所以“握手”会议似乎没有帮助。

我怎样才能从SSLSession?


这些参数的参数是否已嵌入到密码套件中(意味着它们始终是 1024 位),还是服务器的配置由于特定的 DH 参数选择而导致这些密码套件变得较弱?

不,这是一个配置参数对于协议。 Java 默认为 1024 位,但可能会更改globally对于使用系统属性的 JSSE(Java TLS 实现):jdk.tls.ephemeralDHKeySize。最好在启动时使用 Java VM 的 -D 选项进行设置。

对于静态 DH 密钥对(用于身份验证),您必须查看 DH 证书。但我认为你不会发现任何,每个人都使用 RSA 进行身份验证。

无论哪种情况,如果可能的话,我都希望能够从连接中嗅探该信息。有谁知道这是否可以做到,以及如何做到?

嗯,为了sniffingWireShark 等工具就足够了。毫无疑问,您可以从 TLS 连接解析诸如 DH 参数之类的内容(当然,如果首先使用它们)。

您还可以使用调试连接-Djavax.net.debug https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/ReadDebug.html

对于 Java 应用程序/库,您可以查找密码套件,然后,如果它包含DHE_查找上述系统属性(记住其默认值)。


Java JSSE API 编写时并未考虑深度数据包检查。它(字面上)是服务器和客户端应用程序的面向服务的实现。虽然您当然可以使用 OpenJDK 代码本身(它是 GPL 的,对吧?),但您最好使用单独的实现,并且可能具有更宽松的许可证。

然而,对于嗅探器,我宁愿使用 C/C++(或至少是 C/C++ 前端)而不是 Java。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定 Java 中 TLS 握手的 Diffie-Hellman“参数”长度 的相关文章

随机推荐