Skip to content

OpenSSH 7.8 以降はデフォルトの鍵形式が OPENSSH 形式へ変更されている

OpenSSH はバージョン 7.8 からデフォルトの鍵フォーマットが PEM 形式から OPENSSH 形式へ変更されています。 バージョン 7.8 のリリースノート には下記の記載があります。

  • ssh-keygen(1): write OpenSSH format private keys by default instead of using OpenSSL's PEM format. The OpenSSH format, supported in OpenSSH releases since 2014 and described in the PROTOCOL.key file in the source distribution, offers substantially better protection against offline password guessing and supports key comments in private keys. If necessary, it is possible to write old PEM-style keys by adding "-m PEM" to ssh-keygen's arguments when generating or updating a key.

Ubuntu 20.04LTS 上で実際に鍵ペアを作成して鍵フォーマットを確認してみたのでメモしておきます。 OpenSSH は下記の通り、バージョン 8.2 を利用しました。

1
2
$ ssh -V
OpenSSH_8.2p1 Ubuntu-4ubuntu0.4, OpenSSL 1.1.1f  31 Mar 2020

パラメータ指定無しでの鍵ペア作成

特にパラメータを指定せず、ssh-keygen で鍵ペアを作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa
Your public key has been saved in /home/user1/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/g3hh38utVJ/Zrig/1nPTON1l+bQox21xI/bU3u7VAE user1@localhost
The key's randomart image is:
+---[RSA 3072]----+
|             E   |
|              .  |
|               . |
|              . .|
|        S .    oo|
|       . . o  =.B|
|        . + o+.&X|
|         . *o.%@#|
|          o.+B*X@|
+----[SHA256]-----+

3,072bit 長の鍵が作成されたことが分かります。

1
2
$ ssh-keygen -l -f ~/.ssh/id_rsa
3072 SHA256:/g3hh38utVJ/Zrig/1nPTON1l+bQox21xI/bU3u7VAE user1@localhost (RSA)

鍵ファイルの中身は以下のように BEGIN OPENSSH PRIVATE KEY で始まり、END OPENSSH PRIVATE KEY で終わります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ cat ~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAzy91W2vilHJdJidfguUiF0Q+VpTD0bjZ6Kbpdwm7J6bCGua7RGo8
    ・
    ・
    ・
4ocAVTWambvnD36UN6ZmBMTokJ+wKylxv5I1PjEasdaBkJr7YoIf1z4TqZ+KbvRoZZYfBy
KBDX88HgekhuyJAAAAD3VzZXIxQGxvY2FsaG9zdAECAw==
-----END OPENSSH PRIVATE KEY-----

パスワードを指定した鍵ペア作成

パスワードを指定して鍵ペアを作成します。 対話的にパスワードを入力することも出来ますが -N オプションでパスワードを指定することも可能です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ ssh-keygen -N 'PASSWORD'
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Your identification has been saved in /home/user1/.ssh/id_rsa
Your public key has been saved in /home/user1/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:xHVoQV6oU2jn/qXAMUwwvCoTRp9XR4XGXBSX6LVnWuk user1@localhost
The key's randomart image is:
+---[RSA 3072]----+
|       .o++B+=*.o|
|    .  .++Oo*. + |
|   . . oo@.o. . o|
|    o o.= =  . o+|
|   . . oS+ o  .+.|
|    o .   +   oE |
|     o     o o   |
|            o    |
|                 |
+----[SHA256]-----+

パスワードを指定していても -l オプションで見る分には、パスワード有無は分かりません。

1
2
$ ssh-keygen -l -f ~/.ssh/id_rsa
3072 SHA256:xHVoQV6oU2jn/qXAMUwwvCoTRp9XR4XGXBSX6LVnWuk user1@localhost (RSA)

鍵ファイルの中身は以下の通りです。 やはり、パスワードの有無は分かりません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ cat ~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABDLWep9rT
yGWbc6R8PaCQ/7AAAAEAAAAAEAAAGXAAAAB3NzaC1yc2EAAAADAQABAAABgQDbXJLLRFqk
    ・
    ・
    ・
SaQkhXoYSsbpCyOCzWOyJaXGPMEH32VVy2MiK7D1gYz8fZ3AL31IbW2zlzxM46bm20lYCU
eXVCDsxleQ9uGXHIUWkv0pwnojQ=
-----END OPENSSH PRIVATE KEY-----

鍵長を指定した鍵ペア作成

-b オプションで鍵長を指定することが出来ます。 OpenSSH 8.2 時点のデフォルトは 3,072bit ですが、ここでは -b 4096 を指定して 4,096bit 長の鍵を作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ ssh-keygen -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa
Your public key has been saved in /home/user1/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:eWqdnpN6z9FsUKf8R7SYN4Q1XcxY7D+G1HxoY4I0Flk user1@localhost
The key's randomart image is:
+---[RSA 4096]----+
|          .+E  O=|
|          =   + *|
|         o o .++o|
|         .. .+O*+|
|        S . o*+=+|
|         + . =.=o|
|        o o.. = +|
|       . .+o o  .|
|        .oooo    |
+----[SHA256]-----+

鍵ファイルの中身は以下の通りです。 形式自体は 3,072bit 長の鍵ファイルと変わりませんが、ファイルの長さが異なります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ cat ~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAgEAtjZZZ5IZxEDD7L2s7oODN+WRR5ixXiVPsxa4WXfswXZX4aM1KQfw
    ・
    ・
    ・
nR09vGHM3xhvDXLIzXQGegZAUsHJYQv2Pm1oEQO4HCgyZ0tgQIunE204sU0hP6lts2vWDZ
6qpwNyG/9e0AAAAPdXNlcjFAbG9jYWxob3N0AQIDBA==
-----END OPENSSH PRIVATE KEY-----

3,072bit で作成した鍵ファイルは 38 行ありました。

1
2
$ wc -l ~/.ssh/id_rsa
38 /home/user1/.ssh/id_rsa

4,096bit で作成した鍵ファイルは 49 行あり、3,072bit の鍵ファイルよりも行数が多いことが分かります。

1
2
$ wc -l ~/.ssh/id_rsa
49 /home/user1/.ssh/id_rsa

PEM 形式の鍵ペアを作成する

長く利用されてきた従来の PEM 形式で鍵ペアを作成するには -m PEM オプションを指定します。 -mkey-format の略だそうです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ ssh-keygen -m PEM
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa
Your public key has been saved in /home/user1/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:uRKA1R3yzg4lq5hySbQl20D69wuFw+tNX9OqLVK7AqA user1@localhost
The key's randomart image is:
+---[RSA 3072]----+
|  . ......       |
| o o  .o.        |
|. = o . o        |
| o.O o * .       |
| .=.* = S        |
|E. =.* +.. .     |
|. = +.+.o.o .    |
| o . +o+oo o     |
|    . oo++o      |
+----[SHA256]-----+

-l オプションを指定しても、鍵の形式は分かりません (-lv にしても同様です)。

1
2
$ ssh-keygen -l -f ~/.ssh/id_rsa
3072 SHA256:uRKA1R3yzg4lq5hySbQl20D69wuFw+tNX9OqLVK7AqA user1@localhost (RSA)

鍵ファイルの中を見てみると OPENSSH 形式とは異なり、BEGIN RSA PRIVATE KEY で始まり、END RSA PRIVATE KEY で終わっていることが分かり、この部分から「PEM 形式である」と判断出来ます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIG4wIBAAKCAYEAueWnAYhRwzR2ks3Ee7S+6gQTNf8+Z42VXElNGlP0ssIKrtib
xBhjWQwZRN85ioUMaY9q8TpVtyPNCadL8iXFmzjQy+hiBMLRKKDTRh/DMArkDd2U
    ・
    ・
    ・
1Lu9RQTUFmR2Y4R2s+US2mB6n0lusQT7HglmtQlDXy8KswausNPjq0wXZHOLZ2G5
TWCWWFnRZfqBRU7I4H7grMi7tbdyvG9trT9UaKOapyZsnUnPl5QB
-----END RSA PRIVATE KEY-----

パスワードを指定し、PEM 形式の鍵ペアを作成する

PEM 形式でパスワード指定してみます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ ssh-keygen -m PEM -N 'PASSWORD'
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Your identification has been saved in /home/user1/.ssh/id_rsa
Your public key has been saved in /home/user1/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:bEjEAUggh71TUoHJGAazeVGSL/T7RujKhstZx6SHlcA user1@localhost
The key's randomart image is:
+---[RSA 3072]----+
|BX=B=+o.         |
|==@o...          |
|o..E  .          |
| .+ +..o         |
|   o *. S        |
|    O ..         |
| . = *           |
|o.+ + o          |
|.=o. .           |
+----[SHA256]-----+

-l オプションを指定してもパスワード指定されたことは分かりません。

1
2
$ ssh-keygen -l -f ~/.ssh/id_rsa
3072 SHA256:bEjEAUggh71TUoHJGAazeVGSL/T7RujKhstZx6SHlcA user1@localhost (RSA)

鍵ファイルの中身を見ると Proc-Type: 4,ENCRYPTED という部分があり、「パスワードで保護されている」ことが分かります (分かってしまいます)。 鍵ファイルの中身を見た場合、OPENSSH 形式ではパスワードの有無が分かりませんが、PEM 形式ではパスワードの有無が 見た目だけで分かってしまう という違いがあることになります。 この影響により、「Proc-Type の有無」で鍵のパスワード保護有り・無しを判定していたロジックでは OPENSSH 形式の場合、別の実装を考慮する必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,C203929EA45E8C32B3D6AE762CBDA548

1/M6WWeH/R900xNQDslQZ4UsG1MFmjYuEq4iVJDw/Z+jhTfAU0i6kNrhBGNecmlh
uhQEI6b1giocB9jdvf58H3mlzzoU45qOPcJcjwJjICt/69afNcQb6cyfqDjmfZYo
    ・
    ・
    ・
uArQrmL9Qku8UrZR1KM+dwWgRkc395YP9zPf6jOspaGyWp/OSyOCL7AJ1fMvx5W4
-----END RSA PRIVATE KEY-----

ワンライナーでの鍵ペア作成

一切対話無く、ワンライナーで鍵ペアを作成するには以下のように実行します。

1
ssh-keygen -b 4096 -f ~/.ssh/id_rsa -m PEM -N '' -q -t rsa

対話的なパラメータの入力無く、4,096bit 長の鍵ペアが作成されました。

1
2
$ ssh-keygen -l -f ~/.ssh/id_rsa
4096 SHA256:PSSzE8hIyZle8gVU5wBRitzmE+OY5/+gUPbwK2TE3zI user1@localhost (RSA)

鍵の形式も PEM になっています。

1
2
$ head -1 ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----