Aller au contenu
ecdsa.com
Ruby openssl (Net::HTTP verify_hostname, default true)Ruby

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

Comment corriger l’erreur

  1. 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. 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. 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"

Erreurs associées

Parcourir toute la base de données des erreurs de signature