Ошибка рукопожатия TLSv1 - PullRequest
       2

Ошибка рукопожатия TLSv1

12 голосов
/ 19 января 2012

(Отказ от ответственности: я ни на что не похож ни эксперт по безопасности, ни эксперт по Windows)

Установка:

  • сервер с нашей стороны: Java 1.6 (уже добавлен bouncycastle в файл безопасности) на сервере Windows 2003
  • сторонний клиент: сервер Windows 2008 с biztalk
  • все свойства системы повторного согласования, введенные в результате атаки повторного согласования, «включены» на стороне сервера (я не знаю, насколько это безопасно)

В идеале мы хотим исправить это с нашей стороны, но при необходимости можно предложить исправление клиенту.

Клиентский сервер должен подключиться к нашему серверу по соединению HTTPS, но он всегда терпит неудачу, wireshark показывает следующий диалог:

> TLSv1: Client Hello
< TLSv1: Alert (21): Unexpected Message

В соответствии с RFC (http://www.ietf.org/rfc/rfc2246.txt) предупреждение (21) относится к неудачной расшифровке, и из того, что я вижу в wireshark, ни один из шифров, предложенных клиентом, фактически не поддерживается JRE 1.6 (согласно ) http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html#SupportedCipherSuites) Стремясь воспроизвести ошибку, чтобы можно было рассмотреть ее поближе, я протестировал с другим программным обеспечением:

  • wfetch на Windows XP с выбранным «https» выполнит начальное клиентское рукопожатие в SSLv2, сервер переключится на TLSv1 для ответа, это работает
  • wfetch на Windows XP с настроенным на использование «TLSv1» для первоначального рукопожатия не будет работать так же, как сервер biztalk
  • wfetch в windows 2008 с настроенным https использует TLSv1 для первоначального рукопожатия и завершается сбоем так же, как сервер biztalk
  • IE (в windows xp) сначала попытается получить рукопожатие TLSv1 с тем же неудавшимся результатом, но сразу попытается снова, используя SSLv3, который работает (на данный момент я полагаю, что все программное обеспечение Microsoft использует центральную конфигурацию, доступную по адресу HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ Schannel)
  • firefox использует SSLv3 для всего разговора, поэтому никаких проблем нет
  • OpenSSL выполняет первоначальное рукопожатие в SSLv2, и сервер переключается на TLSv1, когда он отвечает, никаких проблем там нет
  • OpenSSL также может быть вынужден выполнить первоначальное рукопожатие в TLSv1, он предлагает список из 27 шифров (в отличие от 11 шифров, предлагаемых программным обеспечением на базе Windows) и может подключаться без проблем

На мой неопытный взгляд, это подтверждает идею о том, что несовместимое предложение шифра является основной причиной, когда Windows поддерживает только наборы шифров, которые не поддерживаются JVM (для TLSv1). Я установил надувной замок в качестве дополнительного поставщика в файле java.security, но безрезультатно. Я искал «высоко» и «низко» и нашел только ссылку, что, возможно, websphere поддерживает Windows-шифры для TLSv1, но не может загрузить автономного поставщика для его тестирования. JRE 1.7 не поддерживается программным обеспечением, которое мы запускаем на нашей JVM, поэтому обновление не вариант (возможно, провайдер безопасности может быть безопасно понижен? Хотя я еще не нашел для него загрузку) Я не нашел способа добавить шифр в окна, за исключением написания кода на C ++ (я безрезультатно поиграл с вышеупомянутыми настройками реестра).

Итак, в заключение я хотел бы знать, исправит ли это что-то из следующего и как их следует выполнить:

  • добавить провайдера в jvm, который может работать с шифрами для TLSv1, которые предлагаются windows
  • каким-то образом заставить клиента выполнить первоначальное рукопожатие в SSLv3 (предпочтительно не SSLv2) или, по крайней мере, повторить попытку, если сбой рукопожатия TLSv1
  • каким-то образом добавить JVM-поддерживаемый шифр для TLSv1 в клиентские окна

Любые другие решения, конечно, также приветствуются.

EDIT

Версия Java Java version (64 bit): 1.6.0_19-b04.

Список предлагаемых шифров:

  • TLS_RSA_WITH_RC4_128_MD5
  • TLS_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_3DES_EDE_CBC_SHA
  • TLS_RSA_WITH_DES_CBC_SHA
  • TLS_RSA_EXPORT1024_WITH_RC4_56_SHA
  • TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA
  • TLS_RSA_EXPORT_WITH_RC4_40_MD5
  • TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5
  • TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
  • TLS_DHE_DSS_WITH_DES_CBC_SHA
  • TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA

Установлены файлы политики криптографии с неограниченной силой. Я попытался установить javax.net.debug=all и запустил сервер с консоли, никаких дополнительных выходных данных не появилось. Я установил sun.security.ssl.allowUnsafeRenegotiation=true безрезультатно.

РЕДАКТИРОВАТЬ 2

Оказывается, программное обеспечение, которое мы используем, использует собственный стек для HTTP вместо стандартного. Было выпущено исправление, которое, похоже, решило проблему, хотя я не знаю точно, какая часть запроса TLS вызвала ошибку (учитывая, что большинство рукопожатий TLSv1 все-таки успешно).

Спасибо за отзыв, это был интересный, но тщетный поиск. Живи и учись.

Ответы [ 2 ]

1 голос
/ 11 июня 2012

Оказывается, программное обеспечение, которое мы используем, использует собственный стек для HTTP вместо стандартного.Было выпущено исправление, которое, похоже, решило проблему, хотя я не знаю точно, какая часть запроса TLS вызвала ошибку (учитывая, что большинство рукопожатий TLSv1 все-таки успешно).

Спасибо за отзыв, это былоинтересный, но бесполезный поиск.Живи и учись.

0 голосов
/ 31 января 2012

Вы можете прочитать мою статью о определении надежности шифра (просто чтобы убедиться, что вы правильно установили шифры jce).В своем вопросе вы говорите, что установили неограниченное количество шифров, но затем ссылаетесь на 128 и 40-битные ключи.Итак, я смущен тем, что у вас есть.Кроме того, не могли бы вы проверить надежность шифра в SSL-сертификате, к которому вы пытаетесь подключиться, и сообщить нам, что это такое и каков алгоритм?Кроме того, убедитесь, что у вашего файла политики для JDK есть надлежащие права, чтобы обеспечить неограниченную силу.

Наконец, вы можете подключиться к «заведомо исправному» сайту SSL, чтобы правильно проверить рукопожатия вашего клиента?(Например, в Gmail)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...