れんとう

まいにち なにか ひとつ

ssh-keygenについて調べてみた 〜鍵束の話の続き〜

フォーマットの違いはわかったけれど

ちょっと前のエントリにも書いた、鍵束の違いについて。

dawon2015.hatenablog.jp

なんか、自分のログを調べたら、こんなメモ書きが出たきた。

ーーーーーーーーーーーーーー
puttygenとssh-keygen -i -f key.pub >> authorized_keys

OS Xならば普通にssh-keygenコマンドで公開鍵と秘密鍵を作ればいい。

中身がBSDだから、当たり前と言えば、当たり前。

Windowsではどうする?

puttygenで秘密鍵と公開鍵を作って、公開鍵をホストへ転送。

その後、ホストで、

ssh-keygen -i -f key.pub >> authorized_keys

して、鍵束に突っ込んでやる。

cat kye.pub >> authorized_keys

だと、うまくいかない。ファイルフォーマットが違うようだ。

ーーーーーーーーーーーーーー

どうやら、3年くらい前に、同じことをやって悩んでいたようだ。

なるほどねぇ。だから、サーバーAには、OpenSSH形式とSECSH形式の両方の公開鍵が登録されていたわけだ。

たまには、真面目に、manを読む

ssh-keygenコマンドは、鍵の発行だけでなくフォーマットの変換もしてくれる、ということはメモ書きを読んでわかった。

しかし、なんも注釈がないメモ書きであるところを見ると、多分、Google大先生に、「Windows ssh-keygen」でお伺いを立てたのだろうなと、思われる。

うん、ここは、ひとつ、いい機会だから、勉強してみよう、と思った。

UNIXのよいところは、「質の良い豊富なドキュメントがコミュニティによって整備されている」ことでもあるのだけど、意外と活用できてないよね。

ということで、やってみた。

$ man ssh-keygen

 

SSH-KEYGEN(1)             BSD General Commands Manual            SSH-KEYGEN(1)

 

NAME

     ssh-keygen — authentication key generation, management and conversion

 

SYNOPSIS

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

書き出しが、「ssh-keygen 認証鍵の作成、管理、変換」。

ここから察するに、-i -m -f あたりオプションをみていくと良さそうだ。

-i オプションにはなんと書いてあるのだろうか?

     -i      This option will read an unencrypted private (or public) key file

             in the format specified by the -m option and print an OpenSSH

             compatible private (or public) key to stdout.  This option allows

             importing keys from other software, including several commercial

             SSH implementations.  The default import format is “RFC4716”.

このオプションは、-mオプションで明記されたフォーマットの暗号化されていない秘密(または公開)鍵ファイルを読み込み、OpenSSHと互換性のある秘密(または公開)鍵として標準出力に書き出す。このオプションは、いくつかの商用SSHを含む他のソフトウェアから鍵をインポートすることを許可している。デフォルトのインポートフォーマットは"RFC4716"である。

と書いてあるので、超訳すると「商用SSHからOpenSSHに変換するよ!-mオプションつけないならRFC4716フォーマットとして読み込むよ」ということだな。

-m オプションはなんて書いてあるのだろうか?

     -m key_format

             Specify a key format for the -i (import) or -e (export) conver‐

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

-i または -e の変換オプションのために鍵のフォーマットを明示する。サポートしているフォーマットは、RFC4716(RFC4716/SSH2 公開または秘密鍵),PKCS8(PEM PKCS8 公開鍵),PEM(PEM公開鍵)。デフォルトの変換フォーマットはRFC4716。

つまり、おいらのメモ書きでは、-m オプションを指定してないってことは、puttykeygenが生成する鍵のフォーマットは、RFC4716ということなのだろうか?

http://www.ietf.org/rfc/rfc4716.txt

うん、どうやらそうらしい。むしろ、「読み込めない!」と思っていた

---- BEGIN SSH2 PUBLIC KEY ----

---- END SSH PUBLIC KEY ----

という書式の方が、準拠なようだ。

 

-f オプションは、キーになるファイルを指定するだけ、らしい。

     -f filename

             Specifies the filename of the key file.

鍵ファイルのファイル名を明記する。

 

ちゃんと調べてみたら、意外と面白かったね。

むしろ鬼子なのは?

Windowsは鬼子、という表現をしてしまったけど、ごめんよ!puttykeygen。

むしろ、puttykeygenで出力された形式の方がRFCに準拠してる形式なんだな。

正直にいうと、「またWindows界隈だけ独自の実装しやがって」とか誤解していました。でも、違うんだね、ちゃんとしてた。

 

こういう、ことがちゃんとわかるから、ちゃんと文書を読んでみる、ということは大切なんだな、ということで。

これからも、適当な思い込みはしないで、ちゃんと文書を読んでみることにする。