Перейти к содержимому
ecdsa.com
Go crypto/x509Go

Сообщение об ошибке

x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs

Также выводится как

  • tls: failed to verify certificate: x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs

Это адрес, по которому шло подключение. Если в сертификате есть IP SAN, но не этот адрес, Go вместо этого сообщает «x509: certificate is valid for <ips>, not <ip>». При подключении через TLS добавляется префикс «tls: failed to verify certificate: ».

Go crypto/x509 — HostnameError when the target is an IP address and the certificate has DNS SANs only

Что это означает

Клиент подключался по IP-адресу, поэтому Go должен найти этот адрес среди записей IP SAN в сертификате, но в сертификате есть только DNS-имена. Go никогда не сопоставляет IP-адрес с DNS-именами или общим именем (CN). Адрес в сообщении — тот, к которому подключался ваш клиент.

Почему это происходит

Как исправить

  1. 1.

    Подключайтесь по адресу, проверяйте имя

    Задайте в tls.Config.ServerName DNS-имя из сертификата. Тогда Go проверяет это имя и отправляет его в SNI, подключаясь по адресу.

    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.

    Добавьте адрес как IP SAN

    Частные CA могут выпускать сертификаты с записями IP; публичные CA делают это редко.

    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: добавьте адрес в сертификат API-сервера

    Передайте дополнительные SAN при kubeadm init (или перевыпустите сертификат apiserver с новыми SAN) и раздайте обновлённый kubeconfig.

    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

Связанные ошибки

Открыть всю базу ошибок подписей