Zum Inhalt springen
ecdsa.com
Go crypto/x509Go

Fehlermeldung

x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs

Auch ausgegeben als

  • tls: failed to verify certificate: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs

Die Adresse ist die, mit der sich der Client verbunden hat. Enthält das Zertifikat zwar IP-SANs, aber nicht diese Adresse, meldet Go stattdessen „x509: certificate is valid for <ips>, not <ip>“. Beim Verbindungsaufbau über TLS kommt das Präfix „tls: failed to verify certificate: “ hinzu.

Go crypto/x509 — HostnameError when the target is an IP address and the certificate has DNS SANs only

Was der Fehler bedeutet

Der Client hat sich mit einer IP-Adresse verbunden, deshalb muss Go diese Adresse unter den IP-SAN-Einträgen des Zertifikats finden, aber das Zertifikat enthält nur DNS-Namen. Go gleicht eine IP-Adresse nie mit DNS-Namen oder dem Common Name ab. Die Adresse in der Meldung ist die, mit der sich dein Client verbunden hat.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Adresse beibehalten, Namen prüfen

    Setze tls.Config.ServerName auf einen DNS-Namen aus dem Zertifikat. Go prüft dann diesen Namen und sendet ihn als SNI, während es sich mit der Adresse verbindet.

    go
    // Dial the address, verify the certificate's DNS name (also sent as SNI)
    transport := &http.Transport{TLSClientConfig: &tls.Config{ServerName: "api.example.com"}}
    client := &http.Client{Transport: transport}
    resp, err := client.Get("https://10.0.0.5:443/healthz")
  2. 2.

    Adresse als IP-SAN hinzufügen

    Private CAs können Zertifikate mit IP-Einträgen ausstellen; öffentliche CAs tun das selten.

    bash
    # Or put the address into the certificate as an IP SAN
    openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \
      -addext "subjectAltName=DNS:api.example.com,IP:10.0.0.5"
  3. 3.

    Kubernetes: Adresse zum Zertifikat des API-Servers hinzufügen

    Übergib bei kubeadm init zusätzliche SANs (oder generiere das apiserver-Zertifikat mit den neuen SANs neu) und verteile eine aktualisierte kubeconfig.

    bash
    # Kubernetes API server reached by a new IP (load balancer, node address)
    kubeadm init --apiserver-cert-extra-sans=10.0.0.5,k8s.example.com
    openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -ext subjectAltName

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen