由于握手失败,我们在启动 Java 应用程序时遇到了问题。经过检查,我们发现应用程序无法连接到服务器,因为服务器需要特定的密码套件 (TLS_RSA_WITH_AES_256_CBC_SHA256),但客户端的 hello 消息中没有它。
我想知道是否有一种方法可以让客户端在 hello 中使用它的密码套件。我不是 SSL/TLS 方面的专家,我需要了解什么才能解决这个问题?
java-版本:
openjdk version "11.0.22" 2024-01-16 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.22.0.7-1) (build 11.0.22+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.22.0.7-1) (build 11.0.22+7-LTS, mixed mode, sharing)
java.security jdk.tls.disabledAlgorithms 条目:
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
java.security jdk.disabled.namedCurves 条目:
jdk.disabled.namedCurves = secp112r1, secp112r2, secp128r1, secp128r2, \
secp160k1, secp160r1, secp160r2, secp192k1, secp192r1, secp224k1, \
secp224r1, secp256k1, sect113r1, sect113r2, sect131r1, sect131r2, \
sect163k1, sect163r1, sect163r2, sect193r1, sect193r2, sect233k1, \
sect233r1, sect239k1, sect283k1, sect283r1, sect409k1, sect409r1, \
sect571k1, sect571r1, X9.62 c2tnb191v1, X9.62 c2tnb191v2, \
X9.62 c2tnb191v3, X9.62 c2tnb239v1, X9.62 c2tnb239v2, X9.62 c2tnb239v3, \
X9.62 c2tnb359v1, X9.62 c2tnb431r1, X9.62 prime192v2, X9.62 prime192v3, \
X9.62 prime239v1, X9.62 prime239v2, X9.62 prime239v3, brainpoolP256r1, \
brainpoolP320r1, brainpoolP384r1, brainpoolP512r1
java.security crypto.policy 条目:
crypto.policy=unlimited
我制作了一个独立的 Java 类,可以打印所有支持的密码和协议(客户端):
try {
SSLContext sslContext = SSLContext.getDefault();
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
System.out.println("Supported Ciphers:");
for (String cipher: sslSocketFactory.getSupportedCipherSuites()) {
System.out.println(cipher);
}
System.out.println("\nSupported Protocols:");
for (String protocol: sslContext.getSupportedSSLParameters().getProtocols()) {
System.out.println(protocol);
}
} catch (Exception e) {
e.printStackTrace();
}
这是输出:
Supported cipher suites:
TLS_AES_256_GCM_SHA384
TLS_AES_128_GCM_SHA256
TLS_CHACHA20_POLY1305_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_EMPTY_RENEGOTIATION_INFO_SCSV
TLS_RSA_WITH_NULL_SHA256
TLS_ECDHE_ECDSA_WITH_NULL_SHA
TLS_ECDHE_RSA_WITH_NULL_SHA
SSL_RSA_WITH_NULL_SHA
Supported protocols:
TLSv1.3
TLSv1.2
TLSv1.1
TLSv1
SSLv3
SSLv2Hello
如您所见,没有提及“TLS_RSA_WITH_AES_256_CBC_SHA256”。我怎样才能启用特定的密码套件?几天前,我不知道怎么回事,但是密码套件出现在列表中,我真的不知道我们做了什么,所以,我知道它是可能的。现在它没有出现,因为我们更改了 Java 安装(但无论如何,两者都是 Java 11)。
所以,我解决了这个问题,是的,这与我使用的 Java 发行版有关。
我使用的是 Red Hat Inc. 的 Java Distribution,通过 Red Hat 的存储库使用 yum 安装,但是,显然,RH 的 Java 不支持我正在寻找的密码套件。当@g00se 提到“许可”时,他们的评论对我很有帮助。因此,根据我对问题的评论,我去下载了 Java 的 .rpm,但这一次是 Oracle 的。
这样,我就把它安装到了我的 RHEL 服务器上:
rpm -ivh jdk-11.0.21_linux-x64_bin.rpm
然后运行我的类来检查是否添加了任何新的密码套件,果然,就是“TLS_RSA_WITH_AES_256_CBC_SHA256”。
从那里,我只是在我的服务文件(运行握手失败的应用程序的文件)中指定使用 Oracle 的 Java,一切工作正常,没有更多错误!
感谢您的所有评论,他们真的帮助了我:)