hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

ssh-keygenコマンドの使い方



1 ssh-keygenコマンドとは?

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

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.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オプションを使います。

4.1 ecdsaキーペアの作成方法

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

[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
Created directory '/root/.ssh'.
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:ipHbxPRlB6FX2bFdV3dvJP2w3PgTW5xXy8sWsqQA1g0 root@server
The key's randomart image is:
+---[ECDSA 256]---+
|        .E=..oooO|
|       o o +. o=O|
|      o o + ..o*O|
|     + . = . o+B*|
|    o o S . o +.B|
|     * .   . . *.|
|    o o       . .|
|                 |
|                 |
+----[SHA256]-----+
[root@server ~]#

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

[root@server ~]# ls -l ~/.ssh/id_ecdsa*
-rw-------. 1 root root 227 12月 21 20:32 /root/.ssh/id_ecdsa
-rw-r--r--. 1 root root 173 12月 21 20:32 /root/.ssh/id_ecdsa.pub

4.2 ed25519キーペアの作成方法

4.1と同様な手順で、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:FQXiUvoKLPn/GJAHuHPu1MAfZ0/Gr1iIiivWWFsTUcQ root@server
The key's randomart image is:
+--[ED25519 256]--+
|      +oo oo.    |
|   . . E . .     |
|  . . + . .      |
|   = + o o       |
|  = O + S +      |
|   B X * = .     |
|  + * B . o .    |
|.o * o o o .     |
|..o.o o.o .      |
+----[SHA256]-----+

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

[root@server ~]# ls -l ~/.ssh/id_ed25519*
-rw-------. 1 root root 399 12月 21 20:33 /root/.ssh/id_ed25519
-rw-r--r--. 1 root root  93 12月 21 20:33 /root/.ssh/id_ed25519.pub

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

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

 -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 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCQwHap8UKRwowwT3red72j+nrSW7D+5pQXhRXLfJ5fVlQiVNeyrcwhEHRL1o2ahF2FriSm9XiKi1DeAhqy4bnI=

次に、パスフレーズを設定した場合について確認してみます。 事前準備として、秘密鍵パスフレーズを設定します。 ★1でパスフレーズ(hogehoge)を設定しました。

[root@server ~]# ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase): ★1
Enter same passphrase again: ★1
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:k9hZHghU5tbJZBSCyu85IqUH84KrVayDBoYt08OJ90o root@server
The key's randomart image is:
+---[ECDSA 256]---+
|     .oo+.=.     |
|      .+ B .     |
|   . .  + *      |
|.= oo  + = .     |
|*.B o.. S .      |
|o=o=. .  .       |
|.oE*.. .         |
|oo+o+ +          |
|+..+ . .         |
+----[SHA256]-----+

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

[root@server ~]# ssh-keygen -y -f ~/.ssh/id_ecdsa
Enter passphrase:

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

6.1 事前準備

まず、ecdsaキーペアを作成します。このとき、パスフレーズにhogehogeと設定しました。

[root@server ~]# ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
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:7a8k0oPdqSMeNjMFyGOnxlxMp/ciVZefUKNnjjB2khw root@server
The key's randomart image is:
+---[ECDSA 256]---+
|      . . E .oo  |
|   . + o o +o. . |
|    = * o B ooo. |
|   + = + + = =o  |
|    = . S o . .  |
|   .   * + .     |
|      O = =      |
|     ..*.= .     |
|     ........    |
+----[SHA256]-----+

6.2 パスフレーズ変更

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

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

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

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

                     192.168.2.0/24
client --------------------------------------- server
     .105                                     .100

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

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

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

[root@client ~]# ssh 192.168.2.100
The authenticity of host '192.168.2.100 (192.168.2.100)' can't be established.
ECDSA key fingerprint is SHA256:5i+bZoKNbptKMfQl4xzA6zSsyHiMjzsRsqRg84K9SDM.
ECDSA key fingerprint is MD5:80:68:92:b8:96:b8:fe:bc:03:dd:40:75:fd:07:12:67.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.100' (ECDSA) to the list of known hosts.
root@192.168.2.100's password:
Last login: Tue Dec 21 21:17:19 2021 from client
[root@server ~]#

次に、サーバのキーペアを確認します。 サーバのキーペアは/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 11月  9 20:33 /etc/ssh/ssh_host_ecdsa_key
-rw-r--r--. 1 root root      162 11月  9 20:33 /etc/ssh/ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys  387 11月  9 20:33 /etc/ssh/ssh_host_ed25519_key
-rw-r--r--. 1 root root       82 11月  9 20:33 /etc/ssh/ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys 1675 11月  9 20:33 /etc/ssh/ssh_host_rsa_key
-rw-r--r--. 1 root root      382 11月  9 20:33 /etc/ssh/ssh_host_rsa_key.pub

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

[root@server ~]# ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key
256 SHA256:5i+bZoKNbptKMfQl4xzA6zSsyHiMjzsRsqRg84K9SDM /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)

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

以下の環境で確認してみます。

                     192.168.2.0/24
client --------------------------------------- server
     .105                                     .100

まず、クライアント側のknown_hostsファイルの中身を確認します。 何も情報が登録されていないことがわかります。

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

サーバにsshログインします。

[root@client ~]# ssh-keygen -R 192.168.2.100
[root@client ~]# ssh 192.168.2.100
The authenticity of host '192.168.2.100 (192.168.2.100)' can't be established.
ECDSA key fingerprint is SHA256:5i+bZoKNbptKMfQl4xzA6zSsyHiMjzsRsqRg84K9SDM.
ECDSA key fingerprint is MD5:80:68:92:b8:96:b8:fe:bc:03:dd:40:75:fd:07:12:67.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.100' (ECDSA) to the list of known hosts.
root@192.168.2.100's password:
Last login: Tue Dec 21 21:13:44 2021 from client
[root@server ~]#

サーバからログアウトします。

[root@server ~]# exit
ログアウト
Connection to 192.168.2.100 closed.
[root@client ~]#

サーバからログアウトしたあと、known_hostsファイルの中身を確認してみます。 サーバのIPアドレス,公開鍵が登録されていることがわかります。

[root@client ~]# cat ~/.ssh/known_hosts
192.168.2.100 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAMB3bmXpN7uSkidRF204jRaGC2b6+T1LP6hOCrJGylBcXtgthIUEVjEHD01UmQMNpemf5L5UmSJg8cf4GFJ9Cw=

known_hostsファイルから、サーバ(192.168.2.100)の情報を削除します。

[root@client ~]# ssh-keygen -R 192.168.2.100
# Host 192.168.2.100 found: line 1
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old

known_hostsファイルを確認します。サーバ(192.168.2.100)の情報が削除されたことがわかります。

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

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

-mオプションを使って、公開鍵のフォーマットを変換することができます。 変換できるフォーマットには、RFC4716,PKCS8,PEMの3つあります。

manの抜粋を以下にしめします。

-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”.

事前準備として、rsaキーペアを作成します。

[root@server ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:GGiO82eyHZPH/v6of7Nt6/itnbjhtqCAc4Jrb2peToU root@server
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|     .           |
|    o .          |
|   +  .o         |
|  o .E..S        |
|   o. oo         |
|   .o**oo  . .   |
|   o=B+=. ..=++o.|
|  ++=o. o*=o=@O+o|
+----[SHA256]-----+

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"
AAAAB3NzaC1yc2EAAAADAQABAAABAQCbBsNbh8kqNPRGFSIvGZgVpoelFHSvpBdV5fw/Y5
/ihhWHsQzdMcuo/TdgUj2OAVwcFhZpwhVmNMN4ASdYP8WBX1Cy0LfdO+QiZVFKEWJCy6cd
dMjfnO8gLAxo9yXGrkhgWLxrEOSAfpPub1Rc81nxlmU+3aTVTZ/53zfGw6hnrlj20NZni4
k36LnoH7bMp8nVuqvFG/vf3NiICALAhhlx0mAK3Q6VoCfSTuWRpwsl5TOFFUvMsy29WZLQ
sBNifJQ9/wA0I+yjdyQd+fSIJN/mfCZQSzgmqSqknJbrTP8z4oD1h5c2ZAxRqkjD0JARBt
ciWalvn1Ifi/FlHW7IcXBp
---- END SSH2 PUBLIC KEY ----

次に、PKCS8形式に変換してみます。

[root@server ~]# ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmwbDW4fJKjT0RhUiLxmY
FaaHpRR0r6QXVeX8P2Of4oYVh7EM3THLqP03YFI9jgFcHBYWacIVZjTDeAEnWD/F
gV9QstC33TvkImVRShFiQsunHXTI35zvICwMaPclxq5IYFi8axDkgH6T7m9UXPNZ
8ZZlPt2k1U2f+d83xsOoZ65Y9tDWZ4uJN+i56B+2zKfJ1bqrxRv739zYiAgCwIYZ
cdJgCt0OlaAn0k7lkacLJeUzhRVLzLMtvVmS0LATYnyUPf8ANCPso3ckHfn0iCTf
5nwmUEs4JqkqpJyW60z/M+KA9YeXNmQMUapIw9CQEQbXIlmpb59SH4vxZR1uyHFw
aQIDAQAB
-----END PUBLIC KEY-----

最後に、PEM形式に変換してみます。

[root@server ~]# ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAmwbDW4fJKjT0RhUiLxmYFaaHpRR0r6QXVeX8P2Of4oYVh7EM3THL
qP03YFI9jgFcHBYWacIVZjTDeAEnWD/FgV9QstC33TvkImVRShFiQsunHXTI35zv
ICwMaPclxq5IYFi8axDkgH6T7m9UXPNZ8ZZlPt2k1U2f+d83xsOoZ65Y9tDWZ4uJ
N+i56B+2zKfJ1bqrxRv739zYiAgCwIYZcdJgCt0OlaAn0k7lkacLJeUzhRVLzLMt
vVmS0LATYnyUPf8ANCPso3ckHfn0iCTf5nwmUEs4JqkqpJyW60z/M+KA9YeXNmQM
UapIw9CQEQbXIlmpb59SH4vxZR1uyHFwaQIDAQAB
-----END RSA PUBLIC KEY-----

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。 Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ