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
Der Client verwendet eine IP-Adresse in der URL
häufigKonfiguration mit direkt eingetragenen IP-Adressen, Service Discovery, die IPs zurückgibt, oder Health Checks gegen Node-Adressen.
Ein Kubernetes-API-Server, der über eine neue Adresse erreicht wird
häufigZugriff auf den Cluster über einen Load Balancer, eine Floating IP oder eine Node-Adresse, die beim Aufruf von kubeadm nicht als zusätzlicher SAN angegeben wurde.
Die IP-Adresse wurde in den Common Name geschrieben
gelegentlichCN=10.0.0.5 wird ignoriert; die Adresse muss ein IP-Eintrag in subjectAltName sein.
So behebst du den Fehler
- 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.
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.
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
x509: certificate is valid for example.com, not api.example.comGo crypto/x509x509: certificate is not valid for any names, but wanted to match api.example.c…Go crypto/x509No subject alternative names matching IP address 127.0.0.1 foundJava (JSSE HostnameChecker)Unable to connect to the server: tls: failed to verify certificate: x509: certi…kubectl (client-go)