Mensagem de erro
x509: certificate is not valid for any names, but wanted to match api.example.com
Também aparece como
- tls: failed to verify certificate: x509: certificate is not valid for any names, but wanted to match api.example.com
O nome depois de “wanted to match” é o destino da sua conexão. Para certificados sem nenhuma extensão SAN, o Go diz “x509: certificate relies on legacy Common Name field, use SANs instead” em vez disso (quando o CN teria correspondido).
Go crypto/x509 — HostnameError for a certificate with no DNS SANs (e.g. IP-only or empty SAN list)
O que significa
O Go tentou comparar o nome de host com o certificado e não encontrou nenhum nome DNS: a extensão SAN existe, mas contém apenas endereços IP (ou outros tipos de entrada), e o Common Name não é considerado. O Go informa que o certificado não cobre nenhum nome e, em seguida, mostra o nome que procurava.
Por que acontece
Um certificado feito para um endereço IP é usado com um nome de host
comumCertificados gerados para o endereço de um nó ou de uma VM (só com SANs de IP) e acessados depois por um nome DNS.
Um certificado feito para outra finalidade
ocasionalCertificados de cliente, de e-mail (S/MIME) ou de assinatura de código não trazem SANs de DNS e não servem como certificados de servidor.
O servidor apresenta o certificado errado
ocasionalUm servidor configurado por engano com um certificado de cliente ou interno, muitas vezes depois de uma rotação de chaves.
Como corrigir
- 1.
Verificar as entradas SAN e a finalidade
A lista de SANs mostra quais tipos de nome existem; o extendedKeyUsage mostra se é mesmo um 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 um certificado de servidor com SANs de DNS
Inclua os nomes DNS que os clientes usam e também entradas de IP, se eles se conectarem pelo endereço.
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 conectar-se pelo endereço que o certificado indica
SANs de IP só correspondem quando o cliente se conecta a esse 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/")