2010-04-09 20 views
11

Sto cercando di connettersi a un webservice su SSL utilizzando Apache Commons HttpClient 3.1, utilizzando questo:SSLException: HelloRequest seguito da un messaggio di stretta di mano inaspettata

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(); 

E ottengo questa eccezione:

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) 

Una richiesta allo stesso URL sulla stessa macchina, usando curl, funziona bene - e se cambio l'URL per es. https://www.verisign.com, funziona perfettamente anche in Java. Quindi sembra essere la combinazione specifica di Java e quell'host, non un problema generale.

Ubuntu 10.04 beta, Sun JDK 1.6.0_19 (stesso problema in Ubuntu in bundle OpenJDK 6b18 ~ pre4).

Qualche idea cosa non va? Grazie!

+1

Vedere http://www.theregister.co.uk/2009/11/14/ssl_renegotiation_bug_exploited/ per una discussione sul perché consentire una rinegoziazione non sicura non è una soluzione a lungo termine. –

+1

La mia domanda è, questo significa che pre JDK 1.6.0.19, la rinegoziazione non sicura era sempre consentita? Ora con 1.6.0.19 siamo costretti a consentire manualmente la rinegoziazione non sicura? Grazie per l'intuizione ... –

+0

Sì, sembrerebbe così. – mseebach

risposta

5

Abbiamo un'applicazione webstart che fallisce a causa di questo problema. La versione della riga di comando funziona di nuovo quando si aggiunge:

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

Ma la versione webstart sembra ignorarlo e fino ad ora non abbiamo trovato un modo per impostare questa proprietà nella versione webstart.

2

Almeno la soluzione funziona per questo problema, anche: aggiungere "-Dsun.security.ssl.allowUnsafeRenegotiation = true"

Grazie molto molto molto per questo! Stavo cercando di utilizzare Maven per distribuire attraverso una connessione SSL, usando i certificati e ho avuto la stessa eccezione. Ora è risolto. Grazie ancora!

1

Solo per aggiungere alcuni aggiornamenti a questo - Oracle has this KB that discusses the problem.

Abbiamo incontrato JRE 1.6.0_20 su Windows 7, ma l'aggiornamento a 1.6.0_25 ha risolto il problema (mi rendo conto che ci sono versioni successive, tuttavia nell'interesse dei test del software testiamo con un gamma di versioni - questa è la prima che abbiamo potuto mettere le mani su).

Problemi correlati