Zum Inhalt springen
ecdsa.com
Ruby openssl (Net::HTTP verify_hostname, default true)Ruby

Fehlermeldung

state=error: certificate verify failed (hostname mismatch)

Auch ausgegeben als

  • OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 peeraddr=127.0.0.1:8443 state=error: certificate verify failed (hostname mismatch)

Vollständige Meldung: „SSL_connect returned=1 errno=0 peeraddr=<ip>:<port> state=error: certificate verify failed (hostname mismatch)“. Der Hostname selbst ist nicht Teil der Meldung; vergleiche die URL mit dem Zertifikat.

Ruby openssl (Net::HTTP verify_hostname, default true) — OpenSSL::SSL::SSLError from SSL_connect

Was der Fehler bedeutet

Die Kette ist vertrauenswürdig, aber der Hostname, mit dem sich Net::HTTP verbunden hat, steht nicht in den Subject Alternative Names des Zertifikats. Aktuelle Ruby-Versionen lassen OpenSSL den Hostnamen während des Handshakes prüfen (verify_hostname), deshalb zeigt sich das Problem als fehlgeschlagene Zertifikatsprüfung; ältere Ruby-Versionen lösten nach dem Verbindungsaufbau einen separaten Fehler „hostname … does not match the server certificate“ aus.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    SAN-Liste mit dem Host vergleichen

    Die Meldung enthält die Namen nicht, gib sie deshalb aus dem Zertifikat aus.

    bash
    echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \
      | openssl x509 -noout -ext subjectAltName
  2. 2.

    Namen des Zertifikats verwenden und Adresse fest vorgeben

    Net::HTTP#ipaddr= verbindet sich mit einer vorgegebenen IP, während SNI und Prüfung den Hostnamen verwenden.

    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.

    Mit allen verwendeten Namen neu ausstellen

    Nimm die fehlenden Namen in subjectAltName auf.

    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"

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen