为 Java 11 启用特定密码套件

问题描述 投票:0回答:1

由于握手失败,我们在启动 Java 应用程序时遇到了问题。经过检查,我们发现应用程序无法连接到服务器,因为服务器需要特定的密码套件 (TLS_RSA_WITH_AES_256_CBC_SHA256),但客户端的 hello 消息中没有它。

我想知道是否有一种方法可以让客户端在 hello 中使用它的密码套件。我不是 SSL/TLS 方面的专家,我需要了解什么才能解决这个问题?

  • Java版本:11.0.22
  • JRE 供应商:Red Hat, Inc.
  • JVM版本:11.0.22+7-LTS

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 ssl tls1.2 handshake
1个回答
0
投票

所以,我解决了这个问题,是的,这与我使用的 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,一切工作正常,没有更多错误!

感谢您的所有评论,他们真的帮助了我:)

© www.soinside.com 2019 - 2024. All rights reserved.