[Linux] 秘密鍵から公開鍵を作成する

例えばSSHでログインするために秘密鍵だけ渡された場合、公開鍵は自分で作成することができます。

$ ssh-keygen -y -f ~/.ssh/id_foo > ~/.ssh/id_foo.pub

準備

秘密鍵を保存

まずはもらってきた秘密鍵を所定の場所に保存します。通常macOSやLinuxでは基本的にホームディレクトリ直下の.sshディレクトリへ設置します。

$ vi ~/.ssh/id_foo
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
(中略)
IDBAUGBw==
-----END OPENSSH PRIVATE KEY-----

秘密鍵のパーミションを設定

秘密鍵のパーミションを600に合わせます。これを忘れるとこのあとつまずきますので必ず行います。

$ chmod 0600 ~/.ssh/id_foo

公開鍵を生成

ssh-keygenコマンドで生成します。一般的に公開鍵の拡張子は.pubとすることが多いですね。

$ ssh-keygen -y -f ~/.ssh/id_foo > ~/.ssh/id_foo.pub

オプションの内容は以下の通り。

-y
OpenSSH形式の秘密鍵を読み込み、OpenSSH形式の公開鍵を標準出力に出力します。
-f
秘密鍵のファイルを指定します。指定しない場合は~/.ssh/id_rsaが利用されます。

エラー

パーミッションがゆるすぎる

パーミッションが600よりもゆるい場合、エラーとなり出力されません。

$ ssh-keygen -f -y ~/.ssh/id_foo > ~/.ssh/id_foo.pub
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/katsube/.ssh/id_foo' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/katsube/.ssh/id_foo": bad permissions

パーミッションを600にすると今度はエラーとならず正常に出力されました。

$ chmod 0600 ~/.ssh/id_foo
$ ssh-keygen -y -f ~/.ssh/id_foo > ~/.ssh/id_foo.pub

参考

  • man ssh-keygen