Сообщение об ошибке
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). Адрес в сообщении — тот, к которому подключался ваш клиент.
Почему это происходит
Клиент указывает в URL IP-адрес
частоКонфигурация с адресами вместо имён, обнаружение сервисов, возвращающее IP-адреса, или проверки состояния по адресам узлов.
К API-серверу Kubernetes обращаются по новому адресу
частоОбращение к кластеру через балансировщик нагрузки, плавающий IP-адрес или адрес узла, который не передали kubeadm как дополнительный SAN.
IP-адрес указан в общем имени (CN)
иногдаCN=10.0.0.5 игнорируется; адрес должен быть записью типа IP в subjectAltName.
Как исправить
- 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.
Добавьте адрес как 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.
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
Связанные ошибки
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)