Pular para o conteúdo
ecdsa.com
Go crypto/x509Go

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

Como corrigir

  1. 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. 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. 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

Ver toda a base de erros de assinatura