SSLException: HelloRequest, за которым следует неожиданное сообщение о рукопожатии

Я пытаюсь подключиться к веб-сервису через SSL, используя Apache Commons HttpClient 3.1, используя это:

String url = "https://archprod.service.eogs.dk/cvronline/esb/LegalUnitGetSSLServicePort";
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(url);
StringRequestEntity entity = new StringRequestEntity(requestXml, "application/soap+xml", "utf-8");
post.setRequestEntity(entity);
client.executeMethod(post);
String response = post.getResponseBodyAsString();

И я получаю это исключение:

javax.net.ssl.SSLException: HelloRequest followed by an unexpected  handshake message
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1623)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:198)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:188)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloRequest(ClientHandshaker.java:286)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:114)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:525)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:465)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:746)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java:78)
at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:106)
at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection.java:1116)
at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.java:1973)
at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1735)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)

Запрос на тот же URL-адрес на том же компьютере с использованием curl работает нормально, и если я изменю URL-адрес, например, на https://www.verisign.com, он также отлично работает в Java. Так что, похоже, это конкретная комбинация Java и этого хоста, а не общая проблема.

Бета-версия Ubuntu 10.04, Sun JDK 1.6.0_19 (такая же проблема в пакете OpenJDK Ubuntu 6b18~pre4).

Любые идеи, что происходит не так? Спасибо!


person mseebach    schedule 09.04.2010    source источник
comment
См. theregister.co.uk/2009/11/14/ssl_renegotiation_bug_exploited для обсуждения того, почему допущение небезопасного повторного согласования не является долгосрочным решением.   -  person Søren Mors    schedule 22.02.2011
comment
Мой вопрос: означает ли это, что до JDK 1.6.0.19 всегда разрешалось небезопасное повторное согласование? Теперь с 1.6.0.19 мы вынуждены разрешать небезопасное повторное согласование вручную? Спасибо за понимание...   -  person    schedule 22.02.2011
comment
Да, казалось бы.   -  person mseebach    schedule 22.02.2011


Ответы (4)


У нас есть приложение webstart, которое не работает из-за этой проблемы. Версия командной строки снова работает при добавлении:

java.lang.System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");

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

person BartH    schedule 20.05.2010

По крайней мере, решение работает и для этой проблемы: добавьте «-Dsun.security.ssl.allowUnsafeRenegotiation=true»

Спасибо вам большое-пребольшое за это! Я пытался использовать развертывание maven через SSL-соединение, используя сертификаты, и у меня было такое же исключение. Теперь это решено. Спасибо еще раз!

person Dave    schedule 08.07.2010

Думаю, та же проблема, что и здесь: http://forums.sun.com/thread.jspa?threadID=5435426

По крайней мере, решение работает и для этой проблемы: добавьте «-Dsun.security.ssl.allowUnsafeRenegotiation=true»

person mseebach    schedule 13.04.2010

Просто чтобы добавить некоторые обновления к этому - у Oracle есть эта база знаний, в которой обсуждается проблема.

Мы столкнулись с JRE 1.6.0_20 в Windows 7, но обновление до 1.6.0_25 решило проблему (я понимаю, что существуют более поздние версии, однако в интересах тестирования программного обеспечения мы тестируем ряд версий - это самое раннее из того, что нам удалось достать).

person Chris J    schedule 10.05.2012