74 votes

Comment les noms de serveur de certificat SSL sont-ils résolus / Puis-je ajouter d'autres noms à l'aide de keytool?

Ceux-ci peuvent être formulées comme des questions distinctes pour plus de clarté, mais ils sont tous liés à la même question.

Comment sont-certificat SSL du serveur de noms résolus?

Pourquoi les navigateurs semblent utiliser le champ CN du certificat, mais Java du mécanisme semble qu'à regarder "les autres noms de l'objet"?

Est-il possible d'ajouter d'autres noms à un certificat SSL à l'aide de keytool? Si non, est à l'aide d'openSSL plutôt une bonne option??

Juste un peu de contexte: j'ai besoin de pour obtenir d'un serveur principal de communiquer avec plusieurs serveurs en utilisant le protocole HTTPS. Évidemment, nous ne voulons pas acheter des certificats SSL pour chaque serveur (il pourrait y en avoir beaucoup), je tiens donc à utiliser des certificats auto-signés (j'ai été en utilisant keytool pour les générer). Après j'ai ajouter les certificats de confiance dans le système d'exploitation, les navigateurs (IE et Chrome) heureux d'accepter la connexion est fiable. Cependant, même après l'ajout de certificats de Java fichier cacerts, Java ne veut toujours pas accepter la connexion est fiable et lève l'Exception suivante:

Causés par: java.de sécurité.cert.CertificateException: Pas d'autres noms de l'objet présent au coucher du soleil.de sécurité.util.HostnameChecker.matchIP(HostnameChecker.java:142) au coucher du soleil.de sécurité.util.HostnameChecker.match(HostnameChecker.java:75) au com.soleil.net.le protocole ssl.interne.le protocole ssl.X509TrustManagerImpl.checkIdentity(X509T rustManagerImpl.java:264) au com.soleil.net.le protocole ssl.interne.le protocole ssl.X509TrustManagerImpl.checkServerTrusted( X509TrustManagerImpl.java:250) au com.soleil.net.le protocole ssl.interne.le protocole ssl.ClientHandshaker.serverCertificate(Clien tHandshaker.java:1185) 14 de plus ...

J'ai trouvé que je peux faire de Java confiance au certificat de mettre mon propre HostNameVerifier, dont j'ai copié à partir d'ici: com.soleil.jbi.interne.de sécurité.https.DefaultHostnameVerifier juste pour tester (en passant, le nom d'hôte passé comme argument à la HostnameVerifier est correct, donc je pense qu'il doit avoir été accepté).

J'ai été en utilisant le champ de certificat CN que le nom d'hôte (généralement de l'adresse IP).

Quelqu'un peut-il me dire si je fais quelque chose de mal et de me diriger dans la bonne direction?

96voto

Bruno Points 47560

Comment le nom d'hôte de vérification doit être fait est défini dans la RFC 6125, ce qui est assez récente et généralise la pratique de tous les protocoles, et remplace la RFC 2818, qui est spécifique à HTTPS. (Je ne suis même pas sûr de Java 7 utilise RFC 6125, qui est peut-être trop récent pour cela.)

À partir de la RFC 2818 (Section 3.1):

Si une extension subjectAltName de type dNSName est présent, qui DOIT être utilisé comme identité. Sinon, le (plus spécifique) Nom Commun champ dans le champ de l'Objet du certificat DOIT être utilisé. Bien que l'utilisation du Nom Commun est la pratique actuelle, il est obsolète et Les Autorités de Certification sont encouragés à utiliser les dNSName à la place.

[...]

Dans certains cas, l'URI spécifié une adresse IP plutôt qu'un nom d'hôte. Dans ce cas, l'adresse ip subjectAltName doit être présent dans le certificat et doit correspondre exactement à la propriété intellectuelle dans l'URI.

Essentiellement, le problème spécifique que vous avez vient du fait que vous utilisez des adresses IP dans votre CN et pas un nom d'hôte. Certains navigateurs peuvent aussi travailler parce que tous les outils de suivre cette spécification strictement, en particulier parce que "plus spécifiques" dans la RFC 2818 n'est pas clairement définie (voir les discussions dans la RFC 6215).

Si vous utilisez keytool, comme de Java 7, keytool a une option pour inclure un autre Nom de l'Objet (voir le tableau dans la documentation pour l' -ext): vous pouvez utiliser -ext san=dns:www.example.com ou -ext san=ip:10.0.0.1.

EDIT:

Vous pouvez demander un SAN dans OpenSSL en changeant openssl.cnf (il va choisir le copier dans le répertoire courant si vous ne souhaitez pas modifier la configuration globale, aussi loin que je me souvienne, ou vous pouvez choisir un emplacement explicite à l'aide de l' OPENSSL_CONF variable d'environnement).

Définissez les options suivantes (trouver les sections appropriées à l'intérieur de crochets en premier):

[req]
req_extensions = v3_req

[ v3_req ]
subjectAltName=IP:10.0.0.1
# or subjectAltName=DNS:www.example.com

Il y a aussi une belle astuce pour utiliser une variable d'environnement pour cette (plutôt que de le fixer dans un fichier de configuration) ici: http://www.crsr.net/Notes/SSL.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X