Mensagem de erro
x509: certificate relies on legacy Common Name field, use SANs instead
Também aparece como
- tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead
Em conexões TLS (Go 1.20+), o texto recebe o prefixo “tls: failed to verify certificate: ”, e clientes HTTP acrescentam “Get \"https://…\": ”. Programas criados com Go (kubectl, Terraform, Docker, Prometheus, Vault CLI) imprimem o mesmo texto.
Go crypto/x509 — HostnameError for a certificate without subjectAltName (Go 1.15+)
O que significa
O certificado do servidor não tem a extensão Subject Alternative Name, então o nome de host existe apenas no Common Name do titular. O Go deixou de aceitar nomes de host do Common Name no Go 1.15 (por completo no 1.17), seguindo a RFC 6125 e as regras do CA/Browser Forum, e diz isso explicitamente quando o CN teria correspondido. A correção é um certificado com SANs; não resta nenhuma opção no lado do cliente.
Por que acontece
O certificado foi gerado sem subjectAltName
comumopenssl req -x509 -subj "/CN=host" sem -addext subjectAltName, ou openssl x509 -req assinando um CSR sem -copy_extensions/-extfile, produz exatamente esse tipo de certificado.
Um perfil de CA interna anterior à exigência de SAN
comumModelos antigos do Active Directory Certificate Services, scripts legados e CAs de appliances costumam emitir certificados só com CN.
Certificados autogerados de dispositivos e de software antigo
ocasionalAlguns appliances, bancos de dados e middlewares geram certificados só com CN na primeira inicialização.
Como corrigir
- 1.
Confirmar que a extensão SAN está ausente
Imprima o titular e o subjectAltName do certificado servido.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -ext subjectAltName # No "X509v3 Subject Alternative Name" in the output -> reissue the certificate - 2.
Reemitir com subjectAltName
Coloque todos os nomes DNS (e endereços IP, se os clientes usarem um) em subjectAltName. Ao assinar CSRs com openssl x509 -req, as extensões do CSR são descartadas, a menos que você passe -copy_extensions copy ou um -extfile.
bash openssl req -new -key server.key -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com" -out server.csr # when signing with "openssl x509 -req", keep the extension: openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -days 90 -copy_extensions copy -out server.pem - 3.
Não procurar uma flag do Go
A válvula de escape temporária GODEBUG=x509ignoreCN=0 foi removida no Go 1.17, então reemitir o certificado é a única correção.
text GODEBUG=x509ignoreCN=0 only worked in Go 1.15–1.16 and was removed in Go 1.17; there is no switch left in current Go releases. The certificate must carry SANs.
Erros 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 presentJava (JSSE HostnameChecker)tls: failed to verify certificate: x509: certificate signed by unknown authorityGo crypto/tls (Go ≥ 1.20)