Saltar al contenido
ecdsa.com
Go crypto/x509Go

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

Cómo solucionarlo

  1. 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. 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. 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

Explorar toda la base de datos de errores de firma