ssh-keygen で生成された OPENSSH フォーマットの秘密鍵を pem フォーマットへ変換する

Mac Mojave から ssh-keygen で出力されるフォーマットが変わった


Posted on Sat, Jul 27, 2019
Tags openssh, ssh-keygen, security

ssh-keygen で生成された秘密鍵のヘッダが BEGIN OPENSSH PRIVATE KEY になっている

最近の Mac から ssh-keygen で生成される秘密鍵のフォーマットが見慣れない感じになっている。

$ ssh-keygen -t rsa -b 4096

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/amasuda/.ssh/id_rsa): /Users/amasuda/hoge/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/amasuda/hoge/id_rsa.
Your public key has been saved in /Users/amasuda/hoge/id_rsa.pub.
The key fingerprint is:

$ cat ~/hoge/id_rsa

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACF>
NhAAAAAwEAAQAAAgEAsOvD4B2eDNB+IjNe3P6uU/KIzkO+nwHAGyjc4hB>
BzSxiEC5zOxRj5DC6JZu21IY0o5k83n8EDEE3MAovMq6cJpBi3Yr0dvxX>
A0g9yjXim3PlUm//SiKHzuz3wYcDSxz9n5IX7meUj5pOOydnGfwk3ZRxk>

通常、特にこのままで問題はないのだが、一部ツール (putty) で ppk フォーマットへ変換するときに、これだと変換に失敗することがある。

その場合は、出力フォーマットのオプションを指定する

$ ssh-keygen -t rsa -b 4096 -m PEM

$ cat ~/hoge/id_rsa

-----BEGIN RSA PRIVATE KEY-----
MIIJJwIBAAKCAgEAuajm9Id4q1NefRUBR9GsddzWRGrlc4ZBle65p82Hn>
zd8xwUvOoRHNArKsl0R+J/5xsYKl5cGKaAiQATsEJUPLHH8uAnvbB8Mb7>
cctW3cmULcDBsqvBOrk5FaSDGtHwlXdQz6eJ7+xbErZpdsyn/jeZHpoc0>

これで、ppk への変換ができる。

すでに OPENSSH フォーマットで登録している場合

既存の OPENSSH フォーマットの id_rsa に対して、下記を実行する

# backup
$ cp id_rsa id_rsa.openssh
$ ssh-keygen -p -m PEM -f id_rsa

新規パスワード入力を求められるが、これは作成時と同じパスワードにしないと別の鍵になってしまう。

putty format へ pem フォーマットの秘密鍵を変換する

$ brew install puttygen 
$ puttygen id_rsa -O private -o id_rsa.ppk

そもそも OPENSSH のヘッダは何なのか?

ssh-keygen の 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''.  Setting a format of ``PEM'' when generating
    or updating a supported private key type will cause the key to be stored in the legacy PEM private key format.

デフォルトは、RFC 4716 - The Secure Shell (SSH) Public Key File Format のフォーマット。これは RFC で定められた秘密鍵のフォーマットだ。

これまで使われていた PEM フォーマットは、Privacy-Enhanced Mail - Wikipedia にもあるとおり、もともとセキュアなメールシステムの RFC 向けに開発された。 しかし、これらの RFC は一つのルート認証局の PKI に基づいたもので、運用の問題で実現することがなかった。

しかし、PEM というフォーマットは秘密鍵、公開鍵のフォーマットとして広く使われたようだ。

RFC 4716 のような仕様が策定され、今回のようにデフォルトの出力も切り替えられているため、PEM もいよいよその役割を終えるのかもしれない。

R.I.P