Message d’erreur
x509: certificate is not valid for any names, but wanted to match api.example.com
Également affiché sous la forme
- tls: failed to verify certificate: x509: certificate is not valid for any names, but wanted to match api.example.com
Le nom qui suit « wanted to match » est la cible de votre connexion. Pour les certificats sans aucune extension SAN, Go affiche plutôt « x509: certificate relies on legacy Common Name field, use SANs instead » (lorsque le CN aurait correspondu).
Go crypto/x509 — HostnameError for a certificate with no DNS SANs (e.g. IP-only or empty SAN list)
Ce que cela signifie
Go a tenté de faire correspondre le nom d’hôte au certificat et n’a trouvé aucun nom DNS : l’extension SAN existe, mais ne contient que des adresses IP (ou d’autres types d’entrées), et le nom commun (CN) n’est pas pris en compte. Go signale que le certificat ne couvre aucun nom, puis indique le nom qu’il cherchait.
Pourquoi cela se produit
Un certificat prévu pour une adresse IP est utilisé avec un nom d’hôte
fréquenteCertificats générés pour l’adresse d’un nœud ou d’une VM (SAN de type IP uniquement), alors que la machine est ensuite jointe par un nom DNS.
Un certificat destiné à autre chose
occasionnelleLes certificats client, les certificats d’e-mail (S/MIME) ou de signature de code ne comportent pas de SAN DNS et ne peuvent pas servir de certificats serveur.
Le serveur présente le mauvais certificat
occasionnelleUn serveur configuré par erreur avec un certificat client ou interne, souvent après une rotation des clés.
Comment corriger l’erreur
- 1.
Vérifier les entrées SAN et l’usage prévu
La liste SAN montre quels types de noms sont présents ; extendedKeyUsage indique s’il s’agit bien d’un certificat serveur.
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.
Émettre un certificat serveur avec des SAN DNS
Incluez les noms DNS qu’utilisent les clients, ainsi que des entrées IP s’ils se connectent aussi par adresse.
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.
Ou se connecter à l’adresse indiquée dans le certificat
Les SAN de type IP ne correspondent que lorsque le client se connecte à cette adresse 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/")