Mensagem de erro
x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs
Também aparece como
- tls: failed to verify certificate: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs
O endereço é aquele usado na conexão. Quando o certificado tem alguns SANs de IP, mas não este endereço, o Go diz “x509: certificate is valid for <ips>, not <ip>” em vez disso. Conexões TLS acrescentam o prefixo “tls: failed to verify certificate: ”.
Go crypto/x509 — HostnameError when the target is an IP address and the certificate has DNS SANs only
O que significa
O cliente se conectou a um endereço IP, então o Go precisa encontrar esse endereço entre as entradas de IP no SAN do certificado, mas o certificado contém apenas nomes DNS. O Go nunca compara um endereço IP com nomes DNS nem com o Common Name. O endereço na mensagem é aquele ao qual seu cliente se conectou.
Por que acontece
O cliente usa um endereço IP na URL
comumConfiguração com endereços puros, descoberta de serviços que retorna IPs ou health checks nos endereços dos nós.
Um servidor de API do Kubernetes acessado por um novo endereço
comumAcesso ao cluster por um balanceador de carga, um IP flutuante ou um endereço de nó que não foi passado ao kubeadm como SAN extra.
O endereço IP foi colocado no Common Name
ocasionalCN=10.0.0.5 é ignorado; o endereço precisa ser uma entrada de IP em subjectAltName.
Como corrigir
- 1.
Manter o endereço e verificar o nome
Defina tls.Config.ServerName como um nome DNS do certificado. O Go então verifica esse nome e o envia como SNI enquanto se conecta ao endereço.
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.
Adicionar o endereço como SAN de IP
CAs privadas podem emitir certificados com entradas de IP; CAs públicas raramente fazem isso.
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.
Kubernetes: adicionar o endereço ao certificado do servidor de API
Passe SANs extras no kubeadm init (ou gere de novo o certificado do apiserver com os novos SANs) e distribua um kubeconfig atualizado.
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
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 matching IP address 127.0.0.1 foundJava (JSSE HostnameChecker)Unable to connect to the server: tls: failed to verify certificate: x509: certi…kubectl (client-go)