ssh-keygenコマンドの使い方


1 ssh-keygenコマンドとは?

SSHの秘密鍵,公開鍵のキーペアを作成するコマンドです。

2 環境

VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンのOS版数は以下のとりです。

OS版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

[root@server ~]# uname -r
3.10.0-957.el7.x86_64
パッケージ版数
[root@server ~]# rpm -qf /usr/bin/ssh-keygen
openssh-7.4p1-16.el7.x86_64

3 オプション一覧

usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
                  [-N new_passphrase] [-C comment] [-f output_keyfile]
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
       ssh-keygen -i [-m key_format] [-f input_keyfile]
       ssh-keygen -e [-m key_format] [-f input_keyfile]
       ssh-keygen -y [-f input_keyfile]
       ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
       ssh-keygen -B [-f input_keyfile]
       ssh-keygen -D pkcs11
       ssh-keygen -F hostname [-f known_hosts_file] [-l]
       ssh-keygen -H [-f known_hosts_file]
       ssh-keygen -R hostname [-f known_hosts_file]
       ssh-keygen -r hostname [-f input_keyfile] [-g]
       ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]
       ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]
                  [-j start_line] [-K checkpt] [-W generator]
       ssh-keygen -s ca_key -I certificate_identity [-h] [-n principals]
                  [-O option] [-V validity_interval] [-z serial_number] file ...
       ssh-keygen -L [-f input_keyfile]
       ssh-keygen -A
       ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
                  file ...
       ssh-keygen -Q -f krl_file file ...

4 キーペアの作成方法(-t)

manによると、作成できるキーペアは、以下の5つあることがわかります。
dsa,ecdsa,ed25519,rsa,rsa1
デフォルトで作成するキーペアはrsaです。
作成するキーペアを明に指定したい場合は、-tオプションを使います。

manの抜粋
[root@server ~]# man ssh-keygen
-snip-
     ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1] [-N new_passphrase] [-C comment] [-f output_keyfile]

4.1 ecdsaキーペアの作成方法

ecdsaキーペアを作成してみます。

Enterキーを入力して、キーペアの作成場所(★1)はデフォルト(~/.ssh)、
パスフレーズ(★2)は設定しませんでした。
なお、パスフレーズは、他人に秘密鍵を解読されないようにするためのものです。

ecdsaキーペアの作成
[root@server ~]# ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa): ★1
Enter passphrase (empty for no passphrase): ★2
Enter same passphrase again: ★2
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:dDO6/a7kvpr7gE2c0kzsKhVWhUWtlj7ozskw+xuZ2Jw root@server
The key's randomart image is:
+---[ECDSA 256]---+
|        .=+.     |
|       o.   .    |
|      o + +o     |
|     . O ++o     |
|      o S+       |
|     . X.*o      |
|    . *.E o.     |
|     . *.B .     |
|      .o@**+o    |
+----[SHA256]-----+

作成したecdsaのキーペアを確認します。
秘密鍵(id_ecdsa)と公開鍵(id_ecdsa.pub)が作成されたことがわかります。

キーペアの確認
[root@server ~]# ls -l ~/.ssh/id_ecdsa*
-rw-------. 1 root root 227  2月  8 20:18 /root/.ssh/id_ecdsa
-rw-r--r--. 1 root root 173  2月  8 20:18 /root/.ssh/id_ecdsa.pub

4.2 ed25519キーペアの作成方法

4.1と同様な手順で、ed25519キーペアを作成してみます。

ed25519キーペアの作成
[root@server ~]# ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519.
Your public key has been saved in /root/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:3r+5XkERSXv8S7AUzBGgOgsC2SwBJAglWmd2TLSv+ZY root@server
The key's randomart image is:
+--[ED25519 256]--+
|X+o +++    .+=*o |
|+o=+ ...  .  oo+ |
|.+ o  .  .   oo o|
|  o    ..   ..o..|
|   . . oS    ....|
|    . .+o.    ...|
|      o....   .. |
|       .E  . o   |
|       ..  .*o   |
+----[SHA256]-----+

作成したed25519のキーペアを確認します。
秘密鍵(id_ed25519)と公開鍵(id_ed25519.pub)が作成されたことがわかります。

キーペアの確認
[root@server ~]# ls -l ~/.ssh/id_ed25519*
-rw-------. 1 root root 399  2月  8 20:39 /root/.ssh/id_ed25519
-rw-r--r--. 1 root root  93  2月  8 20:39 /root/.ssh/id_ed25519.pub

5 秘密鍵にパスフレーズが設定されているかどうかの確認方法(-y)

-yオプションを使うと、秘密鍵から公開鍵を求めることができます。
以下は、manの抜粋です。

yオプションの説明
     -y      This option will read a private OpenSSH format file and print an OpenSSH public key to stdout.

まず、パスフレーズが設定されていない場合について確認してみます。
-fオプションを使って、ecdsaの秘密鍵を指定すると、公開鍵が出力されます。
つまり、この場合、秘密鍵にパスフレーズが設定されていないことになります。

パスフレーズ未設定の場合
[root@server ~]# ssh-keygen -y -f ~/.ssh/id_ecdsa
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAP4rns2rqz2+novhHOQpgf3CeHuxN3zfGonmg52+aMYtsyNzGA/FGTPtz+l5OBPomaFU7ahKZI/QQB4Kqro8Fo=

次に、パスフレーズを設定した場合について確認してみます。
-fオプションを使って、ecdsaの秘密鍵を指定すると、パスフレーズの入力を求められます。
つまり、この場合、秘密鍵にパスフレーズが設定されていることになります。

パスフレーズが設定されている場合
[root@server ~]# ssh-keygen -y -f ~/.ssh/id_ecdsa
Enter passphrase:

6 秘密鍵に設定されたパスフレーズの変更方法(-p)

秘密鍵に設定されたパスフレーズの変更方法について説明します。

-Nオプションでパスフレーズ指定、-fオプションで秘密鍵のファイル名を指定します。
ここでは、パスフレーズとしてtesttestを指定しました。

キーペアの作成
[root@server ~]# ssh-keygen -q -t ecdsa -N testtest -f /root/.ssh/id_ecdsa
キーペアの確認
[root@server ~]# ls -l ~/.ssh/id_ecdsa*
-rw-------. 1 root root 314  2月  8 21:33 /root/.ssh/id_ecdsa
-rw-r--r--. 1 root root 173  2月  8 21:33 /root/.ssh/id_ecdsa.pub

ここで、古いパスフレーズから新しいパスフレーズに変更してみます。

パスフレーズの変更
[root@server ~]# ssh-keygen -p -f ~/.ssh/id_ecdsa
Enter old passphrase:   ★古いパスフレーズ入力
Enter new passphrase (empty for no passphrase):   ★新しいパスフレーズ入力
Enter same passphrase again:   ★新しいパスフレーズを再度入力
Your identification has been saved with the new passphrase.

7 フィンガープリントを表示する方法(-l)

フィンガープリントとは、公開鍵をハッシュ関数でハッシュした値です。
以下の環境で、クライアントでサーバのフィンガープリントを確認してみます。

環境
                     192.168.3.0/24
client --------------------------------------- server
     .20                                     .10

クライアント側でknown_hostsの中身を確認します。
まだ、サーバと接続をしていないので、known_hostsの中身は空です。

known_hostsの確認
[root@client ~]# cat /root/.ssh/known_hosts
[root@client ~]#

クライアントからサーバにログインすると、フィンガープリントが表示されます。
フィンガープリントは、はじめて接続したときに表示されます。
以下のフィンガープリントは、ECDSAの公開鍵が、それぞれSHA256,MD5でハッシュされた値です。

フィンガープリント
[root@client ~]# ssh [email protected]
The authenticity of host '192.168.3.10 (192.168.3.10)' can't be established.
ECDSA key fingerprint is SHA256:84oUTBiPbjzH9qAOSl3FYrkJX8tgN+kL6pDXAA9RiI4.
ECDSA key fingerprint is MD5:f1:ab:cf:88:25:2a:8a:11:84:0b:66:2e:13:6b:62:fa.
-以下、略-

次に、サーバのキーペアを確認します。
サーバのキーペアは/etc/ssh/配下に格納されています。
ECDSAの秘密鍵はssh_host_ecdsa_key、公開鍵はssh_host_ecdsa_key.pubになります。

サーバのキーペア
[root@server ~]# ls -l /etc/ssh/ssh_host_*
-rw-r-----. 1 root ssh_keys  227  2月  2 09:34 /etc/ssh/ssh_host_ecdsa_key
-rw-r--r--. 1 root root      162  2月  2 09:34 /etc/ssh/ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys  387  2月  2 09:34 /etc/ssh/ssh_host_ed25519_key
-rw-r--r--. 1 root root       82  2月  2 09:34 /etc/ssh/ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys 1675  2月  2 09:34 /etc/ssh/ssh_host_rsa_key
-rw-r--r--. 1 root root      382  2月  2 09:34 /etc/ssh/ssh_host_rsa_key.pub

ssh-keygenコマンドを使って、サーバの公開鍵のハッシュ値を求めてみます。
サーバにログインしたときに表示されたハッシュ値と一致することがわかります。
つまり、意図したサーバにsshでログインしていることがわかります。

フィンガープリント
[root@server ~]# ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key
256 SHA256:84oUTBiPbjzH9qAOSl3FYrkJX8tgN+kL6pDXAA9RiI4 /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)

8 known_hostsファイルから公開鍵を削除する方法(-R)

known_hostsファイルを確認する。
サーバのホスト名(kvm),IPアドレス,公開鍵が登録されていることがわかります。

known_hostsファイルの確認
[root@server ~]# cat ~/.ssh/known_hosts
web,192.168.3.30 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDVJMbQ7SzaNaEDrSUR8ZMhF3uqnkdu8UjmpP/S0u3LWC3y2VxiPOfTMGbc9CW08MHKbc4RqpAnuGmPqFFfkbP8=

known_hostsファイルから、webの情報(ホスト名、IPアドレス、公開鍵)を削除します。

サーバの情報削除
[root@server ~]# ssh-keygen -R web
# Host web found: line 1
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old

known_hostsファイルから、webの情報が削除されたことがわかります。

known_hostsファイルの確認
[root@server ~]# cat ~/.ssh/known_hosts
[root@server ~]#

9 フォーマットを変換する方法

-mで指定できるオプションは、RFC4716,PKCS8,PEMの3つあります。

指定可能なフォーマット
     -m key_format
             Specify a key format for the -i (import) or -e (export) conversion options.  The supported key formats are: “RFC4716” (RFC 4716/SSH2 public or
             private key), “PKCS8” (PEM PKCS8 public key) or “PEM” (PEM public key).  The default conversion format is “RFC4716”.
RFC4716形式への変換
[root@server ~]# ssh-keygen -f ~/.ssh/id_rsa.pub -e -m RFC4716
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, converted by root@server from OpenSSH"
AAAAB3NzaC1yc2EAAAADAQABAAABAQCroC5FNIztvhxVfA+PbF7X0e6MohgF4L+m5pkOi7
fZhbZu0abxOVdqX3GsvMutnby1aE1ZoJAIApWRVtjaphSiv18Quzwpg96o6e5c2fvrs1bf
AK4czj1jZGl2f4Dz5SsYjgVOMEHzgDKOeLijifB54ZTNlmMUaXEVVvR/NGaGn5TGqSihgh
9Zd01HhPSHun25SFT7/dNGSxe8Lm1gp1niRywUpneW7zmkIaH5fQ2Y580SGJXBN2OiAFXg
GjS3j6Qoc7jpyFogIzVb5no5uU7aIgZXdO3N32BRSqdo2tVA7f5UluUaXjif07KXHSrlV7
YuYLW4sdOjALtBIuUUNtuX
---- END SSH2 PUBLIC KEY ----
PKCS8形式への変換
[root@server ~]# ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq6AuRTSM7b4cVXwPj2xe
19HujKIYBeC/puaZDou32YW2btGm8TlXal9xrLzLrZ28tWhNWaCQCAKVkVbY2qYU
or9fELs8KYPeqOnuXNn767NW3wCuHM49Y2Rpdn+A8+UrGI4FTjBB84Ayjni4o4nw
eeGUzZZjFGlxFVb0fzRmhp+UxqkooYIfWXdNR4T0h7p9uUhU+/3TRksXvC5tYKdZ
4kcsFKZ3lu85pCGh+X0NmOfNEhiVwTdjogBV4Bo0t4+kKHO46chaICM1W+Z6OblO
2iIGV3Ttzd9gUUqnaNrVQO3+VJblGl44n9Oylx0q5Ve2LmC1uLHTowC7QSLlFDbb
lwIDAQAB
-----END PUBLIC KEY-----
PEM形式への変換
[root@server ~]# ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAq6AuRTSM7b4cVXwPj2xe19HujKIYBeC/puaZDou32YW2btGm8TlX
al9xrLzLrZ28tWhNWaCQCAKVkVbY2qYUor9fELs8KYPeqOnuXNn767NW3wCuHM49
Y2Rpdn+A8+UrGI4FTjBB84Ayjni4o4nweeGUzZZjFGlxFVb0fzRmhp+UxqkooYIf
WXdNR4T0h7p9uUhU+/3TRksXvC5tYKdZ4kcsFKZ3lu85pCGh+X0NmOfNEhiVwTdj
ogBV4Bo0t4+kKHO46chaICM1W+Z6OblO2iIGV3Ttzd9gUUqnaNrVQO3+VJblGl44
n9Oylx0q5Ve2LmC1uLHTowC7QSLlFDbblwIDAQAB
-----END RSA PUBLIC KEY-----

Z 参考情報

12.3. OPENSSH クライアント
7 UNIX / Linux ssh-keygen Command Examples (Private and Public Key Management for SSH)
How do I convert a ssh-keygen public key into a format that openssl PEM_read_bio_RSA_PUBKEY() function will consume?
ssh-keygen で生成された OPENSSH フォーマットの秘密鍵を pem フォーマットへ変換する