it-swarm.com.de

SSL-Peer wurde in Java nicht ordnungsgemäß heruntergefahren

Ich muss eine Anfrage über ein HTTPS-Protokoll stellen. Ich habe folgenden Code geschrieben:

import Java.net.HttpURLConnection;
import Java.net.URL;

import org.junit.Test;

public class XMLHandlerTest {
    private static final String URL = "https://ancine.band.com.br/xml/pgrt1_dta_20150303.xml";

    @Test
    public void testRetrieveSchedule() {
        try {
            HttpURLConnection connection = (HttpURLConnection) new URL(URL).openConnection();
            connection.setRequestMethod("HEAD");
            int responseCode = connection.getResponseCode();
            System.out.println(responseCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Ich habe diese Ausnahme stacktrace mit einer Java.io.EOFException erhalten:

javax.net.ssl.SSLHandshakeException: Remote Host closed connection during handshake
    at Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:953)
    at Sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1332)
    at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1359)
    at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1343)
    at Sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.Java:563)
    at Sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.Java:185)
    at Sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.Java:1301)
    at Java.net.HttpURLConnection.getResponseCode(HttpURLConnection.Java:468)
    at Sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.Java:338)
    at br.com.onebr.onesocial.arte1.service.core.scheduler.Arte1XMLHandlerTest.testRetrieveSchedule(Arte1XMLHandlerTest.Java:16)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.Java:309)
    at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:50)
    at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:459)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:675)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:382)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:192)
Caused by: Java.io.EOFException: SSL peer shut down incorrectly
    at Sun.security.ssl.InputRecord.read(InputRecord.Java:482)
    at Sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:934)
    ... 32 more

Ich habe eine erfolgreiche Antwort von https://google.com erhalten, aber dieser Fehler wurde von der URL oben angegeben ( https://ancine.band.com.br/xml/pgrt1_dta_20150303.xml ).

Bei Verwendung von PHP, .NET und NodeJS funktioniert diese URL gut.

Hat jemand eine Idee, warum das passiert?

25
aneto

Das ist ein Problem des Sicherheitsprotokolls. Ich verwende TLSv1, aber der Host akzeptiert nur TLSv1.1 und TLSv1.2. Dann habe ich das Protokoll in Java mit den folgenden Anweisungen geändert:

System.setProperty("https.protocols", "TLSv1.1");

29
aneto

Sie können Protokollversionen in den Systemeigenschaften folgendermaßen festlegen: 

ssl Handshake Fehler überwinden

System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
4
Zigri2612

Neben der akzeptierten Antwort können auch andere Probleme die Ausnahme verursachen. Für mich war es so, dass das Zertifikat nicht vertrauenswürdig war (d. H. Selbst signiertes Zertifikat und nicht im Trust Store).

Wenn die Zertifikatsdatei nicht existiert oder nicht geladen werden konnte (z. B. Tippfehler im Pfad), kann --- unter bestimmten Umständen --- die gleiche Ausnahme auftreten.

2
D. Kovács

Ich war mit demselben Problem konfrontiert. Das Hinzufügen eines Zertifikats zu Trust Store löste dieses Problem.

0
Ali

Die akzeptierte Antwort hat in meiner Situation nicht funktioniert, nicht sicher, warum. Ich habe von JRE1.7 zu JRE1.8 gewechselt und das Problem wurde dadurch automatisch gelöst. JRE1.8 verwendet standardmäßig TLS1.2

0
Sam Gh

Ich hatte ein ähnliches Problem, das durch Deaktivieren der Option für erweiterte Java-Sicherheit für "SSL 2.0-kompatibles ClientHello-Format" behoben wurde. 

0
Dylan

Dieser Fehler ist generisch für die Sicherheitsbibliotheken und kann in anderen Fällen auftreten. Falls andere Personen den gleichen Fehler beim Senden von E-Mails mit javax.mail an einen SMTP-Server haben. Dann setzt der Code zum Erzwingen eines anderen Protokolls eine Eigenschaft wie folgt:

prop.put("mail.smtp.ssl.protocols", "TLSv1.2");            

//And just in case probably you need to set these too
prop.put("mail.smtp.starttls.enable", true);    
prop.put("mail.smtp.ssl.trust", {YOURSERVERNAME});
0
jolumg