应该如何设置 Java 的系统范围加密策略?

应该如何设置 Java 的系统范围加密策略?

在将基于 Java(和 Jetty)的专有应用程序从 RHEL7 迁移到 RHEL8 时,我学到了一些新东西:至少在 OpenJDK 11 中,JVM 仍然默认值除非指定系统属性,否则将设置为 1024 位 Diffie-Hellman 组jdk.tls.ephemeralDHKeySize。之前没有人注意到,因为所有客户端连接都是通过负载均衡器处理的,但最终发现这一点是因为在同一台主机上运行的 Python 客户端由于DEFAULT 系统范围的加密策略至少需要 2048 位。

虽然设置此系统属性解决了该问题,但深入研究周围记录不良的逻辑update-crypto-policies(8)显示了一些配置条目,这些条目暗示应该根据策略设置此系统属性。

至少其中/usr/lib/jvm/java-11-openjdk/conf/security/java.security存在一条神秘的评论,它指向该工具管理的文件:

# Determines whether this properties file will be appended to
# using the system properties file stored at
# /etc/crypto-policies/back-ends/java.config
#
security.useSystemPropertiesFile=true

该文件是一个符号链接,当DEFAULT选择策略时,它确实包含这些系统属性:

jdk.tls.ephemeralDHKeySize=2048
jdk.certpath.disabledAlgorithms=MD2, MD5, DSA, RSA keySize < 2048
jdk.tls.disabledAlgorithms=DH keySize < 2048, TLSv1.1, TLSv1, SSLv3, SSLv2, DHE_DSS, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, 3DES_EDE_CBC, DES_CBC, RC4_40, RC4_128, DES40_CBC, RC2, HmacMD5
jdk.tls.legacyAlgorithms=

奇怪的是,对于该LEGACY策略,它尝试设置 1023 位密钥大小:

jdk.tls.ephemeralDHKeySize=1023
jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1023
jdk.tls.disabledAlgorithms=DH keySize < 1023, SSLv3, SSLv2, RSA_EXPORT, DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_DSS_EXPORT, DH_RSA_EXPORT, DH_anon, ECDH_anon, DH_RSA, DH_DSS, ECDH, DES_CBC, RC4_40, DES40_CBC, RC2, HmacMD5
jdk.tls.legacyAlgorithms=3DES_EDE_CBC, RC4_128

无论设置哪种策略,服务器将始终使用 1024 位,我通过以下方式验证了这一点sleep 1 | openssl s_client -tls1_2 -cipher EDH -connect rhel8.example:443 | grep "Server Temp Key"

我没有发现任何与 Jetty 相关的问题,这表明这在那里不起作用,但尚未检查这是否仅影响这些专有应用程序。但通过显式设置该属性是可行的,所以我不明白为什么间接设置这些属性也不起作用。(在命令行中-D添加显式设置可能也有效。)-Djava.security.properties=/etc/crypto-policies/back-ends/java.config

我也找不到任何官方文献security.useSystemPropertiesFile

那么,这到底应该如何以及在什么情况下起作用? 是否有我遗漏的文档?

相关内容