本文へスキップ
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 名やコモンネームと照合することはありません。メッセージ内のアドレスは、クライアントが接続したアドレスです。

発生する理由

修正方法

  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 サーバーの証明書にアドレスを追加する

    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

関連するエラー

署名エラーデータベースをすべて見る