本文へスキップ
ecdsa.com
kubectl and other Go clientsDocker と Kubernetes

エラーメッセージ

x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")

別の表記

  • x509: certificate signed by unknown authority (possibly because of "x509: ECDSA verification failure" while trying to verify candidate authority certificate "Example Root CA")

kubectl は「Unable to connect to the server: tls: failed to verify certificate: 」の後にこのテキストを出力します。ECDSA の CA では、内側の理由が「crypto/rsa: verification error」ではなく「x509: ECDSA verification failure」になります。引用符で囲まれた名前は CA のコモンネームです。

kubectl and other Go clients — a CA with the right name but the wrong key (e.g. a kubeconfig from before kubeadm reset)

このエラーの意味

Go は信頼設定の中から、名前がサーバー証明書の発行者(kubeadm のクラスターでは「kubernetes」)と一致する CA を見つけて試しましたが、その CA の鍵では署名を検証できませんでした。kubeconfig にある CA と、API サーバーの証明書に実際に署名した CA という、2 つの異なる CA が同じ名前を持っています。これは、古い ~/.kube/config を残したままクラスターを再構築した(kubeadm reset と init)場合の典型的な結果です。

発生する理由

修正方法

  1. 1.

    CA の鍵が異なることを確認する

    名前が同じで公開鍵のハッシュ値が異なれば、kubeconfig に別のクラスターの CA が入っていることが証明されます。

    bash
    # Same name, different key? Compare the public keys of the two CAs
    kubectl config view --minify --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' \
      | base64 -d | openssl x509 -noout -pubkey | openssl sha256
    sudo openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -pubkey | openssl sha256   # on a control-plane node
  2. 2.

    新しいクラスターの kubeconfig を使う

    kubeadm init の後に /etc/kubernetes/admin.conf をコピーし(またはユーザーの kubeconfig を再生成し)、埋め込まれた CA が新しいクラスターと一致するようにしてください。

    bash
    # After kubeadm init/reset: replace the old kubeconfig with the new admin.conf
    mkdir -p "$HOME/.kube"
    sudo cp /etc/kubernetes/admin.conf "$HOME/.kube/config"
    sudo chown "$(id -u):$(id -g)" "$HOME/.kube/config"
  3. 3.

    どの kubeconfig が有効になっているかを確認する

    KUBECONFIG には複数のファイルを列挙できます。その場合、コンテキストを定義している最初のファイルが優先されます。

    bash
    # Make sure no other kubeconfig overrides it
    echo "$KUBECONFIG"; kubectl config current-context

関連するエラー

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