Mensaje de error
x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs
También se muestra como
- tls: failed to verify certificate: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs
La dirección es la de destino de la conexión. Cuando el certificado tiene algunos SAN de tipo IP, pero no esta dirección, Go dice en cambio «x509: certificate is valid for <ips>, not <ip>». Las conexiones TLS añaden el prefijo «tls: failed to verify certificate: ».
Go crypto/x509 — HostnameError when the target is an IP address and the certificate has DNS SANs only
Qué significa
El cliente se conecta a una dirección IP, así que Go tiene que encontrar esa dirección entre las entradas SAN de tipo IP del certificado, pero el certificado solo contiene nombres DNS. Go nunca compara una dirección IP con nombres DNS ni con el nombre común. La dirección que aparece en el mensaje es la que usa tu cliente para conectarse.
Por qué ocurre
El cliente usa una dirección IP en la URL
frecuenteUna configuración con direcciones literales, un descubrimiento de servicios que devuelve direcciones IP o una comprobación de estado contra las direcciones de los nodos.
Un servidor de API de Kubernetes al que se llega por una dirección nueva
frecuenteAcceso al clúster a través de un balanceador de carga, una IP flotante o una dirección de nodo que no se pasó a kubeadm como SAN adicional.
La dirección IP figura en el nombre común
ocasionalCN=10.0.0.5 se ignora; la dirección tiene que ser una entrada IP en subjectAltName.
Cómo solucionarlo
- 1.
Mantener la dirección y verificar el nombre
Asigna a tls.Config.ServerName un nombre DNS del certificado. Go verifica entonces ese nombre y lo envía como SNI mientras se conecta a la dirección.
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.
Añadir la dirección como SAN de tipo IP
Las CA privadas pueden emitir certificados con entradas IP; las CA públicas rara vez lo hacen.
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: añadir la dirección al certificado del servidor de API
Pasa los SAN adicionales en kubeadm init (o vuelve a generar el certificado del apiserver con los nuevos SAN) y distribuye un kubeconfig actualizado.
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
Errores relacionados
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)