#java #ssl #java-8 #tls1.2 #handshake
#java #ssl #java-8 #tls1.2 #рукопожатие
Вопрос:
Мое приложение java 8 обменивается данными с другой системой через rest, защищенное с помощью TLS1.2. Последние 2 java-патча (261, 271) разорвали соединение, поскольку они добавили некоторую обратную совместимость с TLS1.3. Во время рукопожатия он начал использовать какую-то более новую схему подписи — rsa_pss_rsae_sha256
вместо ранееработает rsa_pkcs1_sha256
(с именем SHA256withRSA
в java8u251), который не работает, потому что он пытается получить доступ к моему закрытому ключу (на CertificateVerify
этапе рукопожатия), который защищен HSM, поэтому он недоступен для его чтения.
Я хотел бы отключить эту новую схему подписи, потому что старой все еще достаточно, и она работала с предыдущим патчем Java, а также использовалась в нескольких других подключениях моего приложения.
Я нашел это решение — https://bugs.openjdk.java.net/browse/JDK-8227445 но когда я установил этот параметр по имени схемы прямой подписи rsa_pss_rsae_sha256
, это не сработало. Знаете ли вы, какое имя я должен передать туда, чтобы отключить эту конкретную схему подписи (или группу всех rsa_pss_*
схем подписи)?
Комментарии:
1. Какой http-клиент вы используете? Можете ли вы опубликовать пример конфигурации ssl вашего клиента?
2.
CloseableHttpClient
сSSLConnectionSocketFactory
помощью (поддерживаемые протоколы — «TLSv1.2», поддерживаемые наборы шифровTLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
иDefaultHostnameVerifier
3. Я смог отключить эту схему (больше не возвращая алгоритмы rsa_pss * в ClientHello), но она все еще пытается ее использовать, потому что при использовании CertificateRequest серверная сторона отправляет
"supported signature algorithms": [ecdsa_secp256r1_sha256, rsa_pss_rsae_sha256, rsa_pkcs1_sha256,...
и пытается подключиться, используя эти алгоритмы в порядке, который вернул сервер.4. Я бы попытался использовать
java.security
file, который настроит TLS для всей JVM. В JDK 8 и более ранних версиях отредактируйте<java-home>/lib/security/java.security
. Все изменения Java TLS указаны в дорожной карте — java.com/en/jre-jdk-cryptoroadmap.html . Вы можете найти в примечаниях к выпуску / дополнительной информации, что было изменено. Я не уверен, что вы можете каким-то образом переопределить порядок шифрования по умолчанию в java — он нуждается в некоторой отладке / тестировании.5. @Paul, я сообщил об этой проблеме команде Oracle, и они исправили свойство jdk.certpath.disabledAlgorithms в исправлении .291. Я также получил обновление от nCipher software (hsm) для обработки алгоритма PSS RSA без необходимости обновления java.