отключение определенной схемы подписи в рукопожатии TLS с использованием java

#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.