java - 确定 Java 中 TLS 握手的 Diffie-Hellman "Parameters"长度

标签 java ssl handshake diffie-hellman

我想与服务器建立 HTTPS 连接,如果我正在使用 非临时 DH key 交换,我想知道参数是什么 是为了那个连接。其实我真的不在乎它是不是 是否短暂。

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

例如,Qualys 社区线程有一个插图 SSLLabs 认为“弱”的密码套件(好吧,每个人都认为 他们很弱……他们只是有一个提示他们的公共(public)工具): https://community.qualys.com/thread/14821

他们特别提到了例如TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 这是密码套件 0x9f 并提及 DH 参数。是那些 parameters 参数被烘焙到密码套件中(意味着它们是 始终 1024 位)或者这是使服务器的配置 由于特定的 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 此时会包含一些关于握手的有趣信息,但它是 nullstartHandshake 的 javadoc 表明它将在握手完成时通知事件监听器。所以我尝试了这个:

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();

... 但是此时 sess 仍然是 null。 “真正的”SSLSession 确实存在并为我提供有关连接的信息,但“握手 session ”似乎始终为 null

所以我尝试编写一个 HandshakeCompletedListener,实际上我确实得到了一个 SSLSession,但它似乎与我可以从 中得到的是同一个SSLSocket 已经存在,因此“握手” session 似乎没有帮助。

如何从 SSLSession 中获取这些参数?

最佳答案

Are those parameters' parameters baked-into the cipher suite (meaning they are always 1024-bit) or is this a configuration of the server that makes those cipher suites weak due to the specific DH parameter choice?

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

对于静态 DH key 对(用于身份验证),您必须查看 DH 证书。但我认为您不会找到任何东西,每个人都使用 RSA 进行身份验证。

In either case, I'd like to be able to sniff that information from the connection if at all possible. Does anyone know if this can be done, and how?

嗯,对于 嗅探 工具,例如 WireShark 就足够了。毫无疑问,您可以从 TLS 连接中解析诸如 DH 参数之类的东西(当然,如果首先使用它们的话)。

您还可以使用 -Djavax.net.debug 调试连接

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


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

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

关于java - 确定 Java 中 TLS 握手的 Diffie-Hellman "Parameters"长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39374024/

相关文章:

android - 如何在 Android 应用程序中检查我的 API URL SSL 和非 SSL 支持?

python - 了解 TCP 监听积压

python - 如果 SSL Labs 显示 "This server' 的证书链不完整,证书握手能否完成。等级上限为B。”?

Java 8 获取列表中的所有元素

java - 使用提升的权限停止 IzPack 运行 ProcessPanel 脚本

java - 如何在jdbc中获取可调用列名

iis - 将 SSL 证书从 Juniper SA 2000 导出到 IIS 7

java - 如何更有效地从互联网上获取数据?

html - 普通网站如何开启https协议(protocol)?