Mensaje de error
x509: certificate is not valid for any names, but wanted to match api.example.com
También se muestra como
- tls: failed to verify certificate: x509: certificate is not valid for any names, but wanted to match api.example.com
El nombre que sigue a «wanted to match» es el destino de tu conexión. Para certificados sin ninguna extensión SAN, Go dice en cambio «x509: certificate relies on legacy Common Name field, use SANs instead» (cuando el CN habría coincidido).
Go crypto/x509 — HostnameError for a certificate with no DNS SANs (e.g. IP-only or empty SAN list)
Qué significa
Go intenta comparar el nombre de host con el certificado y no encuentra ningún nombre DNS: la extensión SAN existe, pero solo contiene direcciones IP (u otros tipos de entrada), y el nombre común no se tiene en cuenta. Go informa de que el certificado no cubre ningún nombre y añade el nombre que buscaba.
Por qué ocurre
Un certificado creado para una dirección IP se usa con un nombre de host
frecuenteCertificados generados para la dirección de un nodo o de una VM (solo SAN de tipo IP) a los que luego se accede mediante un nombre DNS.
Un certificado pensado para otra cosa
ocasionalLos certificados de cliente, de correo electrónico (S/MIME) o de firma de código no llevan SAN de tipo DNS y no pueden servir como certificados de servidor.
El servidor presenta el certificado equivocado
ocasionalUn servidor configurado por error con un certificado de cliente o interno, a menudo tras una rotación de claves.
Cómo solucionarlo
- 1.
Comprobar las entradas SAN y el propósito
La lista de SAN muestra qué tipos de nombres hay; extendedKeyUsage muestra si se trata siquiera de un certificado de servidor.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -ext subjectAltName,extendedKeyUsage - 2.
Emitir un certificado de servidor con SAN de tipo DNS
Incluye los nombres DNS que usan los clientes, más entradas IP si también se conectan por dirección.
bash 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.
O conectarse por la dirección que indica el certificado
Los SAN de tipo IP solo coinciden cuando el cliente se conecta a esa IP.
go // If the certificate is meant for the IP address, dial the IP (it is matched against IP SANs) resp, err := client.Get("https://10.0.0.5:8443/")