- 1 ssh-keygenコマンドとは?
- 2 検証環境
- 3 オプション一覧
- 4 キーペアの作成方法(-t)
- 5 秘密鍵にパスフレーズが設定されているかどうかの確認方法(-y)
- 6 秘密鍵に設定されたパスフレーズの変更方法(-p)
- 7 フィンガープリントを表示する方法(-l)
- 8 known_hostsファイルから公開鍵を削除する方法(-R)
- 9 フォーマットを変換する方法
- Z 参考情報
1 ssh-keygenコマンドとは?
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技術ブログ