Printemps RestTemplate: SSL handshake échec
Je suis en train d'essayer de consommer une bonne ws avec l'authentification basique. Je n'ai pas importer de cert dans mon fichier de clés. Lorsque j'utilise le plugin chrome Advance Rest client
à tester (à l'aide de l'authentification basique avec base64 nom d'utilisateur:pass). Je peux voir la réponse en retour. So far So good.
Mais quand je développe du code Java à consommer ce ws, je reçois SSL handsake échec:
org.springframework.web.client.ResourceAccessException: I/O error:
Received fatal alert: handshake_failure; nested exception is
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:453)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:377)
at test.Rest.main(Rest.java:37) Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
Ma question est: si le problème est que je n'ai pas d'importation cert à mon fichier de clés, puis à la fois le code Java et le plugin ne devrait pas travailler ensemble. Ici, le plugin fonctionne, mais mon code ne fonctionne pas.
Quelle est la raison? Il ya somethings mal avec mon code?
Soufflet est mon code
RestTemplate restTemplate = new RestTemplate();
String plainCreds = "username:pass";
byte[] plainCredsBytes = plainCreds.getBytes(Charset.forName("US-ASCII") );
byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
String base64Creds = new String(base64CredsBytes);
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + base64Creds);
ResponseEntity<String> response =
restTemplate.exchange("https://url",HttpMethod.GET,new
HttpEntity(headers),String.class);
Voici le lien vers le fichier de log:(j'ai remplacer mon serveur de nom par XXXXXX)
http://www.filedropper.com/ssllog
Après l'exécution: openssl s_client -showcerts -tls1 -connexion de l'hôte:port
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
CONNECTED(00000164)
8088:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:.\ssl\s3_pkt.c:362:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1452011344
Timeout : 7200 (sec)
Verify return code: 0 (ok)
---
et c'est la sortie quand je lance la commande openssl s_client -connect server:port
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
CONNECTED(00000164)
depth=0 C = US, ST = "XXXXXX", L = XXXXXX, O = XXXXXX, OU = xxxxx, CN = XXXXXXXXX.test.intranet, emailAddress = xxxxx@xxxxx
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = US, ST = "XXXXXXX ", L = XXXXX, O = XXXXXX, OU = xxxxxx, CN = XXXXXXXXX.test.intranet, emailAddress = xxxxx@xxxxx
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/C=US/ST=XXXXXXX /L=XXXXX/O=XXXXXX/OU=XXXXX/CN=XXXXXX.test.intranet/emailAddress=xxxxx@xxxxx
i:/DC=intranet/DC=xxxx/CN=XXXXXX DEV Issuing CA
---
Server certificate
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXX.....
-----END CERTIFICATE-----
subject=/C=US/ST=XXXXXXX /L=XXXXX/O=XXXXXX/OU=XXXXX/CN=XXXXXX.test.intranet/emailAddress=xxxxx@xxxxx
issuer=/DC=intranet/DC=XXX/CN=XXXXX DEV Issuing CA
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: XXXXX, P-256, 256 bits
---
SSL handshake has read 1895 bytes and written 443 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: 568BF22A5CDBF103155264BBC056B272168AE0777CBC10F055705EB2DD907E5A
Session-ID-ctx:
Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1452012074
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
---
read:errno=0
-Djavax.net.debug=ssl:handshake:verbose
et ajouter le résultat dans votre question, Supplémentaires de débogage arguments sont disponibles ici docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/...Je voudrais étudier votre serveur, car le journal ne contient pas " ServerHello message que si votre serveur n'est pas en cours d'exécution SSL. Si vous avez openssl essayez de vous connecter là avec
openssl s_client -showcerts -tls1 -connect [your_host]:[port]
. Voir aussi smartjava.org/content/how-analyze-java-ssl-errorsMerci Michal. J'ai ajouté de sortie pour l'exécution d'openssl. S'il vous plaît aider moi. Je suis nouveau sur ssl et certificat de trucs
Je chose que vous avez omis
-tls1
openssl commutateur. Post de sortie avec cette option.j'ai posté 2 sortie: on est avec openssl s_client -showcerts -tls1 -connexion de l'hôte:port. Un autre est avec openssl s_client -connect server:port.
OriginalL'auteur David | 2016-01-02
Vous devez vous connecter pour publier un commentaire.
De
javax.net.debug
journal, je vois que vous êtes à l'aide de Java 7 et le client décide de TLSv1. Deopenssl
sortie que votre serveur ne prend pas en charge TLSv1.TLS ver. 1.1 et 1.2 sont désactivés dans Java 7 par défaut.
Permettre TLSv1.1 et TLSv1.2:
Argument JVM:
Ou réglé sur la même propriété, à partir du code Java:
Ou installer JCE Force Illimitée de la politique de fichiers pour Java 7. Je ne suis pas sûr à 100% si cette unique étape permettrait de résoudre le problème, même si il est toujours intéressant d'installer JCE tandis que la JVM pour une utilisation plus forte des versions des algorithmes existants.
Mise à JOUR 29/Sep/2016:
Changé l'ordre des protocoles à partir du meilleur au pire (TLS ver. 1,2 à 1) dans les options 1 et 2.
avant d'essayer d'utiliser -Dhttps.les protocoles=TLSv1,TLSv1.1,TLSv1.2. j'ai aussi essayé d'installer JCE Illimité de la Force politique pour jdk7. J'ai remplacé les fichiers dans le jdk/jre/lib/security par les fichiers dans un fichier zip. Mais il ne fonctionne pas.
Vous êtes les bienvenus David et merci pour vos commentaires et appréciation.
Je voudrais tourner autour de la commande comme ceci -Dhttps.les protocoles=TLSv1.2,TLSv1.1,TLSv1 de Cette façon, il va essayer de la meilleure des protocoles de première et de revenir à la v1 à la fin.
Bon point, je vais mettre à jour la réponse.
OriginalL'auteur Michal Foksa
Si vous arrive d'être à l'aide de Java 7, vous devez indiquer explicitement à Java à utiliser TLSv1.2 protocole. Voici un exemple d'utilisation de Ressort de configuration XML.
Vous pourriez faire la même chose sans XML avec quelque chose comme ceci:
OriginalL'auteur lmiguelmh