Java ssl: chrome / firefox отправляет «G» в заголовке http вместо «GET / HTTP / 1.1» - PullRequest
2 голосов
/ 20 февраля 2012

Привет, я пробую простой Java-сервер HTTP NanoHTTPD: http://elonen.iki.fi/code/nanohttpd/

Сегодня я пытаюсь поддерживать его с помощью HTTPS, поэтому я создаю SSLServerSocket в его конструкторе NanoHTTPD:

// myServerSocket = new ServerSocket(myTcpPort);
myServerSocket = SSLServerSocketFactory.getDefault().createServerSocket(myTcpPort);

, а также поставляется javax.net.ssl.keyStore с 2048-битным ключом RSA

Результатом является успешное соединение https на MSIE6.0, MSIE8.0, Firefox 9.0.1. Однако произойдет сбой в Google Chrome 17.0.963.56 m и Firefox 10.0.1:

после отладки метод NanoHTTPD.HTTPSession.decodeHeader получает только String inLine = "G" только один символ, в то время как обычно здесь вы ожидаете стандартный заголовок http "GET / HTTP/1.1".

Значит, любой, кто знаком с Firefox, может сказать, что отличается в 9.0.1 и 10.0.1 от https / ssl? Что-то сделанное браузерами может быть смыслом. (Конечно, я новичок в Java-программировании на SSL, пожалуйста, скажите мне, если я ошибаюсь в SSLServerSocket).

У меня кросс выложили эту проблему: https://support.mozilla.org/en-US/questions/920116

Спасибо всем.

Ответы [ 2 ]

4 голосов
/ 20 февраля 2012

Суть в том, что ваша реализация SSL не работает.Записи SSL могут быть разделены произвольным образом, и Google и Mozilla изменили способ разделения записей, чтобы обойти некоторые атаки MITM на SSL.В частности, перед отправкой второй записи SSL с остальными данными передается 1-байтовая запись SSL.Похоже, ваша реализация SSL только читает первую запись, а не читает все данные.

См. http://rt.openssl.org/Ticket/Display.html?id=2635&user=guest&pass=guest и https://bugzilla.mozilla.org/show_bug.cgi?id=665814 и статьи типа http://www.livehacking.com/2011/10/27/chrome-15-broke-the-wall-street-journal-while-trying-to-beat-the-beast/

1 голос
/ 25 сентября 2012

Я могу подтвердить, что SSLEngine из Java по умолчанию выглядит неработающим.Я могу обойти это следующим образом:

^Cpck0:bin vladimirralev$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-ssl-false-start --use-spdy=off --use-system-ssl

Это отключает странные режимы TLS.

Похоже, что недавний SSLEngine будет работать правильно, если вы будете следовать инструкциям, которые он вам даетчитать сегментированные пакеты.Вы должны пройти через несколько чтений (с некоторыми прерывистыми состояниями между ними), и в конечном итоге у вас будет полный кусок.

...