SSHの秘密鍵と公開鍵は必ず対となるペアになっているものですが、どの秘密鍵とどの公開鍵が対となる鍵ペアとして一致しているのかわからないという場合に、鍵ペアかどうかを確認することが出来るコマンドを解説します。鍵ペアが一致しているかどうかを複数の暗号化形式(RSA、DSA、ECDSA、ED25519)で検証する方法を示します。
SSHの鍵ペアを作成する (RSA、DSA、ECDSA、ED25519)
SSHの鍵ペアを生成する際、作成する鍵の暗号化形式として「rsa」「dsa」「ecdsa」「ed25519」「ecdsa-sk」「ed25519-sk」の中から指定します。「ecdsa-sk」「ed25519-sk」はFIDO2用の暗号化形式ですので、今回の説明からは除外します。
それぞれの鍵の暗号化形式で鍵ペアを生成します。
# RSA鍵ペアの生成
$ ssh-keygen -t rsa
# DSA鍵ペアの生成
$ ssh-keygen -t dsa
# ECDSA鍵ペアの生成
$ ssh-keygen -t ecdsa
# ED25519鍵ペアの生成
$ ssh-keygen -t ed25519
作成した鍵ペアは次のように秘密鍵と公開鍵のペアで作成されています。
$ ll .ssh/
-rw------- 1 foobar foobar 2610 Dec 10 13:06 id_dsa (DSA秘密鍵)
-rw-r--r-- 1 foobar foobar 578 Dec 10 13:06 id_dsa.pub (DSA公開鍵)
-rw------- 1 foobar foobar 525 Dec 10 13:11 id_ecdsa (ECDSA秘密鍵)
-rw-r--r-- 1 foobar foobar 186 Dec 10 13:11 id_ecdsa.pub (ECDSA公開鍵)
-rw------- 1 foobar foobar 419 Dec 10 13:12 id_ed25519 (ED25519秘密鍵)
-rw-r--r-- 1 foobar foobar 106 Dec 10 13:12 id_ed25519.pub (ED25519公開鍵)
-rw------- 1 foobar foobar 2610 Dec 10 13:06 id_rsa (RSA秘密鍵)
-rw-r--r-- 1 foobar foobar 578 Dec 10 13:06 id_rsa.pub (RSA公開鍵)
鍵ペアが一致しているか確認するコマンド
それぞれの暗号化形式の秘密鍵と公開鍵はペアになっています。しかし、どの秘密鍵と公開鍵がペアなのかわからなくなってしまった場合には、diffコマンドとssh-keygenコマンドの組み合わせコマンドで、秘密鍵と公開鍵がペアであるかどうかを確認することが出来ます。どの暗号化形式の鍵でも以下の方法で一致確認を行うことが出来ます。
# RSA鍵ペアの一致確認
$ diff <(ssh-keygen -y -e -f ~/.ssh/id_rsa) <(ssh-keygen -y -e -f ~/.ssh/id_rsa.pub)
# DSA鍵ペアの一致確認
$ diff <(ssh-keygen -y -e -f ~/.ssh/id_dsa) <(ssh-keygen -y -e -f ~/.ssh/id_dsa.pub)
# ECDSA鍵ペアの一致確認
$ diff <(ssh-keygen -y -e -f ~/.ssh/id_ecdsa) <(ssh-keygen -y -e -f ~/.ssh/id_ecdsa.pub)
# ED25519鍵ペアの一致確認
$ diff <(ssh-keygen -y -e -f ~/.ssh/id_ed25519) <(ssh-keygen -y -e -f ~/.ssh/id_ed25519.pub)
このコマンドの実行結果が何も出力されていなければ、秘密鍵と公開鍵は一致しているといことになります。しかしもし一致していない場合には差分が表示されますので、それらの鍵はペアではないという意味になります。
例えばRSAの秘密鍵とECDSAの公開鍵を比較してみると、一致していないので次のように差異が表示されますので、指定された秘密鍵と公開鍵は一致していないということになります。
$ diff <(ssh-keygen -y -e -f ~/.ssh/id_rsa) <(ssh-keygen -y -e -f ~/.ssh/id_ecdsa.pub)
2,10c2,4
< Comment: "3072-bit RSA, converted by foobar@DESKTOP-MACHINE from Ope"
< AAAAB3NzaC1yc2EAAAADAQABAAABgQCo7jfmWf5OWfHqumyMdMIGdc3oEGsiNB72jEyGPJ
< /uxdTvFAlbjgTTVLtrO67mE9NEKWVFo16ldJdK26S8gAlZugSS1/QuoULjPT7CH06cD5Qd
< qrMCqXDKtAImwVXiNow42KgLlOZqEQWOe7fa/fmSe63UWXzGzOIBMTSfXyoxOagG7WZVqL
< dmLoLVC0xw4VIz9T2COWfcK0E0lj4djYEwZY7AwwPDqiSg0gMW25KD25/urM9/IvhemBP7
< RcWz+1cLBUWEazYxT0h41i9AyFmuVSHJ6ViIFNRjA2AnScOHdyf2/TYWT+/C29HWhKSQCi
< 6KJUsNEpUeDXPfg6O+iHKH8HcxCA2JTLjFm25V9VCpxRz3xHrxLfUEInQHtma7VOF7Hpxz
< lvCdrOGgI6H7UOZPdLORwrqCiLRxVyuV0+WtL+PCdgYyjlWVe6xIreXw18XSwNiT1itE8i
< r6ZbFNi/aGSJD9zqji4qTDE+a/qrY39Zpq4feegaIKRWBOKVjHFNs=
---
> Comment: "256-bit ECDSA, converted by foobar@DESKTOP-MACHINE from Op"
> AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGpeMguQ+fFqT1uJO/
> I4l2hdC+hyiXOpDtrihAt7ft01+Q/vvsEInMbD4vAgLbmMC3eYHeviK7Dgt/3/rDpu+F0=
まとめ
秘密鍵と公開鍵が一致しているかどうかわからない場合に、各暗号形式ごとに簡単に比較できる方法を説明しました。秘密鍵と公開鍵が一致していないと思わぬトラブルに巻き込まれることがありますので、「本当にこの秘密鍵と公開鍵はペアなのだろうか?」という疑問を持ったら必ず一致確認をしましょう。