エラーメッセージ
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 名やコモンネームと照合することはありません。メッセージ内のアドレスは、クライアントが接続したアドレスです。
発生する理由
クライアントが URL に IP アドレスを使っている
よくあるアドレスを直接記述した設定、IP アドレスを返すサービスディスカバリ、ノードのアドレスに対するヘルスチェックが該当します。
新しいアドレス経由でアクセスされる Kubernetes の API サーバー
よくあるロードバランサー、フローティング IP、ノードのアドレスのうち、kubeadm に追加の SAN として渡していないものを経由してクラスターにアクセスしているケースです。
IP アドレスがコモンネームに入れられている
ときどきCN=10.0.0.5 は無視されます。アドレスは subjectAltName の IP エントリとして記載しなければなりません。
修正方法
- 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 サーバーの証明書にアドレスを追加する
kubeadm init の実行時に追加の SAN を渡し(または新しい SAN を含めて apiserver の証明書を再生成し)、更新した 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)