Проблема Java "нет общих наборов шифров" при попытке безопасного подключения к серверу
У меня есть проблема, когда клиент (не мой) безопасно подключается к моему серверу.
Кажется, что соединение отклоняется из-за несовпадения шифров, но я убедился, что сервер действительно разделяет некоторые шифры с клиентом.
Может ли быть проблема с неизвестным шифром (Unknown 0x0:0x60)? Если так, что я должен сделать, чтобы исправить это?
Журналы Java SSL показаны ниже:
Listener-https, setSoTimeout(30000) called
Worker-30, READ: SSLv3 Handshake, length = 63
*** ClientHello, SSLv3
RandomCookie: GMT: 1267050437 bytes = { 23, 244, 228, 68, 161, 225, 218, 222, 207, 128, 228, 138, 127, 141, 159, 63, 232, 48, 242, 240, 26, 76, 58, 158, 179, 0, 192, 140 }
Session ID: {}
Cipher Suites: [TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_IDEA_CBC_SHA, SSL_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_EXPORT1024_WITH_RC4_56_SHA, Unknown 0x0:0x60, SSL_RSA_EXPORT_WITH_RC4_40_MD5]
Compression Methods: { 0 }
***
Worker-30, SEND SSLv3 ALERT: fatal, description = handshake_failure
Worker-30, WRITE: SSLv3 Alert, length = 2
Worker-30, called closeSocket()
Worker-30, handling exception: javax.net.ssl.SSLHandshakeException: no cipher suites in common
Worker-30, called close()
Worker-30, called closeInternal(true)
Worker-30, called close()
Worker-30, called closeInternal(true)
Спасибо, Бен
2 ответа
В дополнение к ответу erickson, если ваш сертификат не использует пару ключей RSA и вместо этого оказывается, что используется пара ключей DSA, то никакое количество "наполнения" набора шифров RSA не поможет в решении этой проблемы. Вам нужно будет включить связанные с DSA комплекты шифров (они обычно обозначаются ключевым словом DSS в них), а также чтобы клиент использовал те же комплекты шифров.
Причина, по которой этот крайний случай может оказаться вашей проблемой, связана с поведением утилиты keytool по умолчанию при генерации секретных пар ключей - по умолчанию используется алгоритм DSA, а не RSA.
Вы говорите, что некоторые из запрошенных клиентом шифров включены на вашем сервере. Вы успешно связались с одним из них? Например, попробуйте OpenSSL s_client
утилита с -cipher
опция, указывающая только этот набор шифров.
Возможно, поставщик не поддерживает все шифры, которые, по вашему мнению, вы включили, или, возможно, на вашем сервере неправильно установлены файлы юрисдикции неограниченной силы.