SSL par les pairs fermé correctement en Java
J'ai besoin de faire une demande par le biais d'un protocole HTTPS. J'ai écrit le code suivant:
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();
}
}
}
J'ai eu cette exception stacktrace avec un java.io.EOFException:
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
J'ai obtenu de réponse satisfaisante de https://google.com mais cette erreur à partir de l'URL ci-dessus (https://ancine.band.com.br/xml/pgrt1_dta_20150303.xml).
À l'aide de PHP, .NET et NodeJS cette URL fonctionne très bien.
Quelqu'un a une idée de pourquoi cela se produit?
java version que vous utilisez pour exécuter le programme?
S'il vous plaît exécuter votre client avec
Je suis à l'aide de OpenJDK Environnement d'Exécution (IcedTea 2.5.4) (7u75-2.5.4-1~trusty1).
S'il vous plaît exécuter votre client avec
-Djavax.net.debug=ssl,handshake
et après la sortie dans votre question.Je suis à l'aide de OpenJDK Environnement d'Exécution (IcedTea 2.5.4) (7u75-2.5.4-1~trusty1).
OriginalL'auteur aneto | 2015-03-06
Vous devez vous connecter pour publier un commentaire.
Que c'est un problème de protocole de sécurité. Je suis à l'aide de TLSv1 mais l'hôte d'accepter seulement les TLSv1.1 et TLSv1.2 puis j'ai changé le protocole en Java avec les instructions ci-dessous:
System.setProperty("https.protocols", "TLSv1.1")
;Aussi, cette réponse n'a pas fonctionné pour moi.
OriginalL'auteur
Vous pouvez définir les versions du protocole du système de la propriété :
surmonter ssl handshake erreur
OriginalL'auteur
En dehors de la accepté de répondre, d'autres problèmes peuvent provoquer l'exception. Pour moi, c'était que le certificat n'était pas digne de confiance (c'est à dire, l'auto-signé cert et pas dans le magasin de confiance).
Si le fichier de certificat n'existe pas, ou n'a pas pu être chargé (p. ex., faute de frappe dans le chemin d'accès) peut-dans certaines circonstances---cause de la même exception.
Ajouter à votre truststore (pour le système d'exploitation à l'échelle de l'un ou de définir un lors du démarrage de la JVM avec
-Djavax.net.ssl.trustStore=...
et-Djavax.net.ssl.trustStorePassword=...
.)OriginalL'auteur
J'ai été confronté à la même question, pour moi, l'ajout d'un certificat à la banque de confiance à résoudre ce problème.
OriginalL'auteur
J'ai eu un problème similaire qui a été résolu en désactivant l'option dans java avancé de sécurité pour "Utiliser SSL 2.0 compatible ClientHello format.
OriginalL'auteur
Cette erreur est générique de la sécurité des bibliothèques et qui pourrait se produire dans d'autres cas.
Dans le cas où d'autres personnes ont ce même message d'erreur lors de l'envoi d'e-mails avec javax.courrier à un serveur smtp. Ensuite le code pour forcer d'autres protocole est la définition d'une propriété comme ceci:
OriginalL'auteur
Accepté la réponse n'a pas de travail dans ma situation, je ne sais pas pourquoi. Je suis passé de JRE1.7 à JRE1.8 et qui a permis de résoudre le problème automatiquement.
JRE1.8 utilise TLS1.2 par défaut,
OriginalL'auteur
Dans mon cas, il y a juste un espace blanc dans l'URL. Afin de vérifier la chaîne de requête de premier!
OriginalL'auteur