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

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

Como corrigir

  1. 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. 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. 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/")

Erros relacionados

Ver toda a base de erros de assinatura