Je suis passé de Java 1.6 à Java 1.7 aujourd'hui. Depuis lors, une erreur se produit lorsque j'essaie d'établir une connexion avec mon serveur Web via SSL:
javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name
at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1288)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1904)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1027)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:523)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1296)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at java.net.URL.openStream(URL.java:1035)
Voici le code:
SAXBuilder builder = new SAXBuilder();
Document document = null;
try {
url = new URL(https://some url);
document = (Document) builder.build(url.openStream());
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(DownloadLoadiciousComputer.class.getName()).log(Level.SEVERE, null, ex);
}
Ce n'est qu'un projet de test, c'est pourquoi j'autorise et utilise des certificats non approuvés avec le code:
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
Logger.getLogger(DownloadManager.class.getName()).log(Level.SEVERE, null, e);
}
J'ai essayé avec succès de me connecter à https://google.com . où est ma faute?
Merci.
J'avais ce que je crois être le même problème. J'ai trouvé que j'avais besoin d'ajuster la configuration Apache pour inclure un ServerName ou ServerAlias pour l'hôte.
Ce code a échoué:
Et ce code a fonctionné:
Wireshark a révélé que pendant l'alerte TSL / SSL Hello l'alerte d'avertissement (niveau: avertissement, description: nom non reconnu), le serveur Hello était envoyé du serveur au client. Ce n'était qu'un avertissement, cependant, Java 7.1 a alors immédiatement répondu avec un "Fatal, Description: Message inattendu", ce qui, je suppose, signifie que les bibliothèques SSL Java n'aiment pas voir l'avertissement de nom non reconnu.
Du Wiki sur la sécurité de la couche de transport (TLS):
112 TLS d'avertissement de nom non reconnu uniquement; L'indicateur de nom de serveur du client a spécifié un nom d'hôte non pris en charge par le serveur
Cela m'a amené à regarder mes fichiers de configuration Apache et j'ai constaté que si j'ajoutais un ServerName ou ServerAlias pour le nom envoyé du côté client / java, cela fonctionnait correctement sans aucune erreur.
la source
ServerAlias
travail pour moi. J'avais vu la même alerte TLS dans Wireshark.ServerName
s, Apache répond avec uneunrecognized_name
alerte d' avertissement (qui peut également être une alerte fatale ). La RFC 6066 le dit précisément sur ce sujet: " Il n'est PAS RECOMMANDÉ d'envoyer une alerte de niveau d'avertissement non reconnu (112), car le comportement du client en réponse aux alertes de niveau d'avertissement est imprévisible. ". La seule erreur commise par cet employé est de supposer qu'il s'agissait d'une alerte fatale . Il s'agit autant d'un bug JRE que d'Apache.Vous pouvez désactiver l'envoi d'enregistrements SNI avec la propriété System jsse.enableSNIExtension = false.
Si vous pouvez changer le code, il est utile de l'utiliser
SSLCocketFactory#createSocket()
(sans paramètre d'hôte ou avec un socket connecté). Dans ce cas, il n'enverra pas d'indication nom_serveur.la source
System.setProperty ("jsse.enableSNIExtension", "false");
-Djsse.enableSNIExtension=false
. Mais que fait-il d'autre? Est-ce dangereux pour le reste de la sécurité Javas?Nous avons également rencontré cette erreur sur une nouvelle version de serveur Apache.
Le correctif dans notre cas était de définir un
ServerAlias
dans lehttpd.conf
qui correspondait au nom d'hôte auquel Java essayait de se connecter. Notre aServerName
été défini sur le nom d'hôte interne. Notre certificat SSL utilisait le nom d'hôte externe, mais cela n'était pas suffisant pour éviter l'avertissement.Pour aider au débogage, vous pouvez utiliser cette commande ssl:
openssl s_client -servername <hostname> -connect <hostname>:443 -state
S'il y a un problème avec ce nom d'hôte, il affichera ce message vers le haut de la sortie:
SSL3 alert read: warning:unrecognized name
Je dois également noter que nous n'avons pas obtenu cette erreur lors de l'utilisation de cette commande pour se connecter au nom d'hôte interne, même si elle ne correspondait pas au certificat SSL.
la source
openssl
. C'est très utile.SSL3 alert read: warning:unrecognized name
? Je vois l'alerte imprimée, mais la sortie ne m'aide pas à voir réellement cette différence de dénominationOpenSSL 1.0.1e-fips 11 Feb 2013
,OpenSSL 1.0.2k-fips 26 Jan 2017
etLibreSSL 2.6.5
.Au lieu de compter sur le mécanisme d'hôte virtuel par défaut dans apache, vous pouvez définir un dernier hôte virtuel catchall qui utilise un ServerName arbitraire et un ServerAlias générique, par exemple
De cette façon, vous pouvez utiliser SNI et apache ne renverra pas l'avertissement SSL.
Bien sûr, cela ne fonctionne que si vous pouvez décrire facilement tous vos domaines à l'aide d'une syntaxe générique.
la source
*.mydomain.com
syntaxe pour ServerAlias. Notez que vous pouvez ajouter plusieurs alias en utilisantServerAlias
, par exempleServerAlias *.mydomain.com mydomain.com *.myotherdomain.com
.Cela devrait être utile. Pour réessayer sur une erreur SNI dans Apache HttpClient 4.4 - la manière la plus simple que nous ayons trouvée (voir HTTPCLIENT-1522 ):
et
et
la source
verifyHostname(sslsock, target)
enSSLConnectionSocketFactory.createLayeredSocket
? Puisque letarget
est changé en chaîne vide,verifyHostname
ne va pas réussir. Suis-je en train de manquer quelque chose d'évident ici?Utilisation:
la source
Ran dans ce problème avec Spring Boot et jvm 1.7 et 1.8. Sur AWS, nous n'avions pas la possibilité de modifier le ServerName et le ServerAlias pour qu'ils correspondent (ils sont différents), nous avons donc fait ce qui suit:
Dans build.gradle, nous avons ajouté ce qui suit:
Cela nous a permis de contourner le problème avec le "nom non reconnu".
la source
Malheureusement, vous ne pouvez pas fournir de propriétés système à l'outil jarsigner.exe.
J'ai soumis le défaut 7177232 , faisant référence au défaut 7127374 de @eckes et expliquant pourquoi il a été fermé par erreur.
Mon défaut concerne spécifiquement l'impact sur l'outil jarsigner, mais cela les conduira peut-être à rouvrir l'autre défaut et à résoudre correctement le problème.
MISE À JOUR: En fait, il s'avère que vous POUVEZ fournir des propriétés système à l'outil Jarsigner, ce n'est tout simplement pas dans le message d'aide. Utilisation
jarsigner -J-Djsse.enableSNIExtension=false
la source
J'ai rencontré le même problème et il s'est avéré que le DNS inverse n'était pas configuré correctement, il indiquait un mauvais nom d'hôte pour l'IP. Après avoir corrigé le DNS inversé et redémarré httpd, l'avertissement a disparu. (si je ne corrige pas le DNS inversé, l'ajout de ServerName a également fait l'affaire pour moi)
la source
Mon
VirtualHost
« sServerName
a été commenté par défaut. Cela a fonctionné après avoir commenté.la source
Si vous créez un client avec Resttemplate, vous pouvez uniquement définir le point de terminaison comme ceci: https: // IP / path_to_service et définir la requestFactory.
Avec cette solution, vous n'avez pas besoin de redémarrer votre TOMCAT ou Apache:
la source
J'ai également rencontré ce problème lors de la mise à niveau de Java 1.6_29 vers 1.7.
De façon alarmante, mon client a découvert un paramètre dans le panneau de configuration Java qui résout ce problème.
Dans l'onglet Avancé, vous pouvez cocher «Utiliser le format ClientHello compatible SSL 2.0».
Cela semble résoudre le problème.
Nous utilisons des applets Java dans un navigateur Internet Explorer.
J'espère que cela t'aides.
la source
J'ai eu le même problème avec un serveur Ubuntu Linux exécutant subversion lors d'un accès via Eclipse.
Il a montré que le problème était lié à un avertissement lors du démarrage (re) d'Apache:
Cela est dû à une nouvelle entrée dans
ports.conf
, où une autreNameVirtualHost
directive a été introduite parallèlement à la directive ensites-enabled/000-default
.Après avoir supprimé la directive
ports.conf
, le problème avait disparu (après avoir redémarré Apache, naturellement)la source
Juste pour ajouter une solution ici. Cela pourrait aider les utilisateurs de LAMP
La ligne mentionnée ci-dessus dans la configuration de l'hôte virtuel était le coupable.
Configuration de l'hôte virtuel en cas d'erreur
Configuration de travail
la source
Voici la solution pour Appache httpclient 4.5.11. J'ai eu un problème avec le cert qui a fait un joker
*.hostname.com
. Il m'a renvoyé la même exception, mais je ne dois pas utiliser la désactivation par propriétéSystem.setProperty("jsse.enableSNIExtension", "false");
car cela a fait une erreur dans le client de localisation Google.J'ai trouvé une solution simple (ne modifiant que le socket):
la source
Il existe un moyen plus simple où vous pouvez simplement utiliser votre propre HostnameVerifier pour approuver implicitement certaines connexions. Le problème vient de Java 1.7 où des extensions SNI ont été ajoutées et votre erreur est due à une mauvaise configuration du serveur.
Vous pouvez soit utiliser "-Djsse.enableSNIExtension = false" pour désactiver SNI sur l'ensemble de la JVM, soit lire mon blog où j'explique comment implémenter un vérificateur personnalisé au-dessus d'une connexion URL.
la source