Message d’erreur
state=error: certificate verify failed (hostname mismatch)
Également affiché sous la forme
- OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 peeraddr=127.0.0.1:8443 state=error: certificate verify failed (hostname mismatch)
Message complet : « SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (hostname mismatch) ». Le nom d’hôte lui-même ne figure pas dans le message ; comparez l’URL avec le certificat.
Ruby openssl (Net::HTTP verify_hostname, default true) — OpenSSL::SSL::SSLError from SSL_connect
Ce que cela signifie
La chaîne est approuvée, mais le nom d’hôte auquel Net::HTTP s’est connecté ne figure pas parmi les noms alternatifs du sujet (Subject Alternative Names) du certificat. Les versions actuelles de Ruby laissent OpenSSL vérifier le nom d’hôte pendant le handshake (verify_hostname) : le problème apparaît donc comme un échec de vérification du certificat. Les anciennes versions de Ruby levaient une erreur distincte, « hostname … does not match the server certificate », après la connexion.
Pourquoi cela se produit
Le certificat ne couvre pas ce nom
fréquenteDes sous-domaines, le domaine nu ou des hôtes renommés absents de la liste des SAN.
Connexion par adresse IP ou par un alias interne
fréquenteDes clients de base de données, Redis ou d’API configurés avec des adresses IP ou des noms de conteneurs.
Le serveur a renvoyé son certificat par défaut
occasionnelleUn proxy qui ne connaît pas le nom demandé sert le certificat d’un autre site.
Comment corriger l’erreur
- 1.
Comparer la liste des SAN avec l’hôte
Le message n’indique pas les noms : affichez-les à partir du certificat.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -ext subjectAltName - 2.
Utiliser le nom du certificat et fixer l’adresse
Net::HTTP#ipaddr= se connecte à une adresse IP donnée, tandis que le SNI et la vérification utilisent le nom d’hôte.
ruby # Connect to a specific address but verify the certificate's name (Net::HTTP#ipaddr=) http = Net::HTTP.new("www.example.com", 443) http.ipaddr = "10.0.0.5" http.use_ssl = true http.get("/health") - 3.
Réémettre avec tous les noms utilisés
Ajoutez les noms manquants à subjectAltName.
bash openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com,DNS:www.example.com"