Как должна работать установка общесистемной криптографической политики для Java?
При переносе проприетарного приложения на основе Java (и Jetty) с RHEL7 на RHEL8 я узнал кое-что новое: по крайней мере, в OpenJDK 11 JVM по-прежнему по умолчанию использует 1024-битную группу Диффи-Хеллмана, если не указано системное свойство.jdk.tls.ephemeralDHKeySize
. Раньше никто этого не замечал, поскольку все клиентские соединения обрабатываются через балансировщик нагрузки, но в конце концов это было обнаружено, потому что клиент Python, работающий на том же хосте, больше не мог подключаться из-за общесистемной криптографической политики, которая требует как минимум 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
policy он пытается установить размер ключа длиной 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
.
Так как же и в каком контексте это должно работать? И может быть где-то есть какая-то документация, которую я пропустил?