パスワードを忘れた? アカウント作成
12517611 journal
日記

dodaの日記: PuTTYの秘密鍵が独自形式な理由

日記 by doda

PuTTY では認証に使う秘密鍵の保存に独自の形式(PPK形式)を使いますが、これはなぜか、
あと関連して ssh の公開鍵認証のやりとりと OpenSSH の ssh クライアントの挙動に
ついての話です。

結局のところはここに書いてあるように PPK 形式の方が優れている
(OpenSSH の秘密鍵の形式には欠点がある)という事なんですが。

ssh での公開鍵認証のやりとりは以下のような流れです。

1. クライアントが「公開鍵認証だけどこの公開鍵は使える?」と公開鍵を送る
2. サーバが「その鍵は使えるよ/使えないよ」と答える
3a. 「使えないよ」と返ってきた場合、1 に戻って他の公開鍵を試したり、別の認証方式を試す
3b. 「使えるよ」と返ってきた場合、「この公開鍵で認証するよ、署名はこれね」と公開鍵と、
        認証用のデータを秘密鍵で署名してその署名を送る。
4. サーバは公開鍵と署名を確認し、認証が成功したか失敗したかを返す

1~2で使える公開鍵の確認をしていますが、これは余計な署名を行わない為です。
秘密鍵は通常暗号化してあり、署名をする時にはパスフレーズが必要になります。
例えば秘密鍵として id_rsa と id_ecdsa の二つが有り、サーバ側の authorized_keys に
id_ecdsa の公開鍵が登録されている場合、いきなり署名して送る方式(プロトコル的にはこれも許される)だと

1. id_rsa で署名(パスフレーズが要求される)して認証要求を行い、認証が失敗する
2. id_ecdsa で署名(パスフレーズが要求される)して認証要求を行い、認証が成功する

というようにパスフレーズ入力が二度必要になります。
事前に公開鍵が使えるかの確認が入る事で id_rsa で署名する為のパスフレーズ入力が必要なくなります。
また署名自体が重い処理である為、秘密鍵にパスフレーズが付いていなくても
よけいな署名を行うのを避けられる事には意味があります。
# まあ今時の環境だと署名の重さは気にならないでしょうが

ここで秘密鍵の形式が問題になってきます。
秘密鍵のファイルの中には公開鍵の情報も含まれています。
しかし OpenSSH の秘密鍵形式では全体が暗号化されている為(*1)、秘密鍵ファイルの中から
公開鍵を取り出す為にはパスフレーズが必要になります。
これでは使えない鍵に対するパスフレーズの入力が避けられません。
そこで OpenSSH では "秘密鍵のファイル名.pub" というファイル、例えば id_rsa.pub が有ったら
それを秘密鍵に対応する公開鍵として扱います。
これによってパスフレーズ無しに公開鍵が使えるかの確認が行えるようになりましたが、
秘密鍵だけを置き換えるなどの原因で秘密鍵と公開鍵の対応が取れていない時は
認証が行えなくなるという問題が出ます(*2)。

一方、PPK 形式では公開鍵の部分は平文で保存されている為、パスフレーズ無しで公開鍵が取り出せます。
また秘密鍵ファイル一つで完結している為、秘密鍵と公開鍵の対応が取れていないという問題も発生しません。

PPK 形式の利点としては公開鍵部分も含めて全体が MAC で守られているので改竄が出来ないというのもありますが、
これについては省略します。

という事で PuTTY が秘密鍵に独自形式を使っているのは自己主張とか嫌がらせとかじゃなくちゃんと理由があるんです。

2020/02/19 追記:
*1: OpenSSH の秘密鍵形式では全体が暗号化されている
ここで OpenSSH の秘密鍵形式と言っている物は、正確には OpenSSL の PEM 形式です。
OpenSSH 6.5 から新しい OpenSSH 独自の秘密鍵形式が導入されましたが、この形式では公開鍵部分は暗号化されていません。しかし PEM 形式との互換性の為か、秘密鍵ファイルがこの形式でも公開鍵ファイルが存在する場合はそちらを優先するという動作は変わっていません。

*2: 秘密鍵と公開鍵の対応が取れていない時は認証が行えなくなる
OpenSSH 7.6 からはこのような時には "identity_sign: private key /home/user/.ssh/id_rsa contents do not match public" のような警告メッセージが出てその鍵での認証を行わなくなるので、問題に気づき易くなっています。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常

読み込み中...