gpt4 book ai didi

java - SSLSockets 和密码规范问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:57:25 25 4
gpt4 key购买 nike

我正在尝试让我的 java 客户端使用 SSL 与 C 服务器通信。

问题是 - 我没有任何服务器源并且我收到握手失败错误:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1657)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:932)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
at posslu.Main.main(Main.java:36)
Java Result: 1

经过一些繁重的无线网络攻击后,我现在知道,工作的 C 客户端(我也无法访问它们的源代码)在客户端-服务器问候数据包中有这些密码规范:

Cipher Spec: SSL2_DES_192_EDE3_CBC_WITH_MD5 (0x0700c0)
Cipher Spec: SSL2_IDEA_128_CBC_WITH_MD5 (0x050080)
Cipher Spec: SSL2_RC2_CBC_128_CBC_WITH_MD5 (0x030080)
Cipher Spec: SSL2_RC4_128_WITH_MD5 (0x010080)
Cipher Spec: SSL2_RC4_64_WITH_MD5 (0x080080)
Cipher Spec: SSL2_DES_64_CBC_WITH_MD5 (0x060040)
Cipher Spec: SSL2_RC2_CBC_128_CBC_WITH_MD5 (0x040080)
Cipher Spec: SSL2_RC4_128_EXPORT40_WITH_MD5 (0x020080)

并且所有数据包都以 SSLv2 协议(protocol)发送。

这些是 SSLSocket.getSupportedCipherSuites() 方法的规范:

SSL_RSA_WITH_RC4_128_MD5   
SSL_RSA_WITH_RC4_128_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_DSS_WITH_AES_128_CBC_SHA
SSL_RSA_WITH_3DES_EDE_CBC_SHA
SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
SSL_RSA_WITH_DES_CBC_SHA
SSL_DHE_RSA_WITH_DES_CBC_SHA
SSL_DHE_DSS_WITH_DES_CBC_SHA
SSL_RSA_EXPORT_WITH_RC4_40_MD5
SSL_RSA_EXPORT_WITH_DES40_CBC_SHA
SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
SSL_RSA_WITH_NULL_MD5
SSL_RSA_WITH_NULL_SHA
SSL_DH_anon_WITH_RC4_128_MD5
TLS_DH_anon_WITH_AES_128_CBC_SHA
SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
SSL_DH_anon_WITH_DES_CBC_SHA
SSL_DH_anon_EXPORT_WITH_RC4_40_MD5
SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA
TLS_KRB5_WITH_RC4_128_SHA
TLS_KRB5_WITH_RC4_128_MD5
TLS_KRB5_WITH_3DES_EDE_CBC_SHA
TLS_KRB5_WITH_3DES_EDE_CBC_MD5
TLS_KRB5_WITH_DES_CBC_SHA
TLS_KRB5_WITH_DES_CBC_MD5
TLS_KRB5_EXPORT_WITH_RC4_40_SHA
TLS_KRB5_EXPORT_WITH_RC4_40_MD5
TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA
TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5

现在我要用

Cipher Spec: SSL2_RC4_128_WITH_MD5 (0x010080)

因为看起来 C 服务器和我的 java 客户端都支持它。所以我想出了这段代码:

SSLSocketFactory sslsockfact = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsockfact.createSocket( args[0], args[1] );

sslsocket.setEnabledCipherSuites( new String[] { "SSL_RSA_WITH_RC4_128_MD5" } );
sslsocket.startHandshake();

但出于某种原因,这些密码规范是在客户端问候数据包中发送的:

Cipher Spec: TLS_RSA_WITH_RC4_128_MD5 (0x000004)
Cipher Spec: SSL2_RC4_128_WITH_MD5 (0x010080)

不应该只包括第二个吗?这会导致服务器以 TLSv1 协议(protocol)发送服务器问候数据包并导致握手失败。

我继续试图弄清楚发生了什么:

这些是我从 getSupportedProtocols() 获得的支持的协议(protocol):

SSLv2Hello
SSLv3
TLSv1

如果我在我的代码中加入这样的东西:

sslsocket.setEnabledProtocols( new String[] { "SSLv2Hello" } );

它说:

Exception in thread "main" java.lang.IllegalArgumentException: SSLv2Hellocannot be enabled unless TLSv1 or SSLv3 is also enabled

如果我切换到:

sslsocket.setEnabledProtocols( new String[] { "SSLv2Hello", "SSLv3" } );

服务器在 SSLv3 中应答,我得到握手失败...

就是这样,我不知道如何让它工作,有什么帮助吗?

有没有可能不再支持 SSLv2 而我根本无法将它与 java 一起使用?

最佳答案

JDK JSSE 提供程序不支持 SSL v2,这是一种本质上不安全的协议(protocol)。 SSLv2Hello 支持旨在与某些可能存在协议(protocol)错误并需要 v2 hello 的服务器兼容 SSLv3。这个 SSLv2Hello 在 JDK7 中被移除了。

对于实际对话,仅支持 SSLv3 和 TLS。因此,如果您的服务器仅支持 SSL v2,则需要升级服务器 - v2 不安全,不应使用。

SSL_RSA_WITH_RC4_128_MD5TLS_RSA_WITH_RC4_128_MD5 是相同的密码套件,但是当通过 SSLSocketFactory.getSupportedCipherSuites(),只报告前者。当前的 Wireshark 协议(protocol)分析器将报告 TLS_RSA_WITH_RC4_128_MD5 (0x0004),这可能会导致混淆。

另见:

How to initiate ssl connection using SSLv2 http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html

编辑:因为我在上面提到过 SSLv2 非常不受欢迎且不安全,我觉得我现在也应该提到,因为 SSLv3 POODLE exploit已发布,SSLv3 也被认为是不安全的并且已弃用。

关于java - SSLSockets 和密码规范问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1939289/

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