Message d’erreur
x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs
Également affiché sous la forme
- tls: failed to verify certificate: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs
L’adresse est celle à laquelle le client s’est connecté. Lorsque le certificat comporte des SAN de type IP, mais pas cette adresse, Go affiche plutôt « x509: certificate is valid for <ips>, not <ip> ». Les connexions TLS ajoutent le préfixe « tls: failed to verify certificate: ».
Go crypto/x509 — HostnameError when the target is an IP address and the certificate has DNS SANs only
Ce que cela signifie
Le client s’est connecté à une adresse IP : Go doit donc trouver cette adresse parmi les entrées SAN de type IP du certificat, mais celui-ci ne contient que des noms DNS. Go ne compare jamais une adresse IP aux noms DNS ni au nom commun (CN). L’adresse figurant dans le message est celle à laquelle votre client s’est connecté.
Pourquoi cela se produit
Le client utilise une adresse IP dans l’URL
fréquenteConfiguration avec des adresses brutes, découverte de services qui renvoie des adresses IP, ou contrôles d’intégrité visant les adresses des nœuds.
Un serveur d’API Kubernetes joint par une nouvelle adresse
fréquenteAccès au cluster via un répartiteur de charge, une IP flottante ou une adresse de nœud, alors que cette adresse n’a pas été transmise à kubeadm comme SAN supplémentaire.
L’adresse IP a été placée dans le nom commun (CN)
occasionnelleCN=10.0.0.5 est ignoré ; l’adresse doit figurer comme entrée IP dans subjectAltName.
Comment corriger l’erreur
- 1.
Garder l’adresse, vérifier le nom
Renseignez dans tls.Config.ServerName un nom DNS présent dans le certificat. Go vérifie alors ce nom et l’envoie comme SNI tout en se connectant à l’adresse.
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.
Ajouter l’adresse comme SAN de type IP
Les AC privées peuvent émettre des certificats avec des entrées IP ; les AC publiques le font rarement.
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 : ajouter l’adresse au certificat du serveur d’API
Passez des SAN supplémentaires lors de kubeadm init (ou régénérez le certificat apiserver avec les nouveaux SAN), puis distribuez un kubeconfig mis à jour.
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
Erreurs associées
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)