Вопрос по java – SSL рукопожатие с более старыми клиентами, использующими SSLEngine (JSSE)

1

Это дополнительный вопрос к & quot;SSL рукопожатие с использованием самоподписанных сертификатов и SSLEngine (JSSE)& Quot ;.

Я реализовал веб-сервер NIO, который может обрабатывать сообщения SSL и не-SSL на одном и том же порту. Чтобы различать сообщения SSL и не-SSL, я проверяю первый байт входящего запроса, чтобы увидеть, является ли это сообщением SSL / TLS. Пример:

byte a = read(buf);
if (totalBytesRead==1 && (a>19 && a<25)){
    parseTLS(buf);
}

В методе parseTLS () я создаю экземпляр SSLEngine, запускаю рукопожатие, упаковываю / разворачиваю сообщения и т. Д. Все выглядит нормально для большинства современных веб-браузеров (Firefox 10, IE 9, Safari 5 и т. Д.).

Проблема заключается в том, что старые веб-браузеры, такие как IE 6, и библиотеки, такие как класс Java URLConnection, по-видимому, инициируют рукопожатие SSL / TLS по-разному. Например, первые несколько байтов из IE 6 выглядят примерно так (шестнадцатеричные значения):

80 4F 01 03 00 ...

Если я передаю сообщение в SSLEngine, он, похоже, не распознает сообщение и выдает исключение.

javax.net.ssl.SSLException: Unsupported record version Unknown-0.0

Итак, что же передают IE 6 и класс URLConnection Java? Это действительное сообщение SSL / TLS, которое может поддерживать JSSE SSLEngine? Должен ли я выполнить некоторую предварительную обработку или договориться с клиентом, чтобы отправить другое сообщение?

Заранее спасибо!

UPDATE

Благодаря Bruno и EJP и некоторой дальнейшей отладке я намного лучше понимаю, что происходит. Как правильно указал Бруно, клиенты IE6 и Java 6 отправляют через SSLv2 ClientHello. Вопреки одному из моих предыдущих комментариев, SSLEngine в Java 1.6 может фактически развернуть сообщение SSLv2 и сгенерировать правильный ответ для отправки клиенту. Исключение SSLEx, о котором я сообщал ранее, было ошибкой на моей стороне и не имеет ничего общего с SSLEngine (я неправильно предположил, что клиент завершил отправку данных, и в результате я получил пустой ByteBuffer, когда SSLEngine ожидал, что будет развернуто больше данных).

Ваш Ответ

1   ответ
4

Здравствуйте, клиент SSLv2 (см. спецификацию TLS):

TLS 1.1 clients that support SSL Version 2.0 servers MUST send SSL Version 2.0 client hello messages [SSL2]. TLS servers SHOULD accept either client hello format if they wish to support SSL 2.0 clients on the same connection port. The only deviations from the Version 2.0 specification are the ability to specify a version with a value of three and the support for more ciphering types in the CipherSpec.

80 4F is the length and the high bit must be set to 1 (see msg_length description). 01 is the message type (Client Hello) 03 00 is the highest supported version (SSLv3 here)

Начиная с Java 7,теперь это отключено по умолчанию.

EDIT:

Просто для пояснения, это на самом деле не клиент SSLv2 Hello, это клиент Hello Hello для SSLv3 в формате SSLv2. В этом случае сервер ответит (правильным) Привет SSLv3 Server (соответствует03 00 запрашиваемый номер версии). То же самое работает и для TLS 1.0, 1.1 и 1.2, хотя использование этого формата постепенно не рекомендуется.

A JSSE 7SSLServerSocket будет по-прежнему понимать такое приветствие клиента и отвечать соответствующим образом с помощью приветствия сервера SSLv3 / TLS1.x.

Error: User Rate Limit Exceeded80 4F 01 03 00.
Error: User Rate Limit Exceeded03 00Error: User Rate Limit Exceeded03 01Error: User Rate Limit Exceeded03 02Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Peter
Error: User Rate Limit Exceededdocs.oracle.com/javase/6/docs/technotes/guides/security/jsse/…Error: User Rate Limit Exceeded Peter
Error: User Rate Limit Exceeded Peter

Похожие вопросы