SSH接続フロー解説の修正
PlantUML というツールがあり、見やすい画像を作れるかもしれない。
KEXが途中ですが、作画してみました。出来ている部分でおかしな点があれば指摘していただけるでしょうか。
図を更新しました。https://ttssh2.osdn.jp/snapshot/ssh-flow/
既存の図で問題があるところは特に確認していただけると幸いです。
RFC では "server's public host key" と書かれている K_S を、"サーバホスト鍵の秘密鍵"/"public key of server's host key" としています。
厳密には「サーバホスト鍵ペアの秘密鍵」なのでこうしましたが、RFC の表現 "server's public host key", "サーバの公開ホスト鍵" でも通じるものでしょうか。
"private key of server's host key" としてあります。
signature の生成にサーバホスト鍵の秘密鍵を使うので、秘密鍵であることを記述したいです。
ここにも、K_S の結論と同じ形になる表現を用います。
「復号」と書いていたが、「検証」という語を使うように変更(r10670)
署名の検証には RSA_public_decrypt() 関数が使われている(OpenSSH でもそう @ ssh-rsa.c openssh_RSA_verify() )のだが、RFC 4253, 4419,5656 には「verifies the signature s on H」とあるため。
H から s(signature) を生成するのが sign で、それに対応するのが verify であるなら、s から H(サーバ側) を復元する部分が verify(検証) である(cf. https://www.jipdec.or.jp/project/research/why-e-signature/PKI-crypto-mechanism.html#col3 )。だが、H(サーバから送られてきたsを復元したもの) と H(クライアント側で生成したハッシュ) を比較することで署名が正しいかどうか判定できる。「verifies the signature s on H」は復元と比較までを含むものとみなし「検証」という言葉を選択した。s から H(サーバ側) を生成する verify(検証) については触れないこととした。
「公開鍵を用いて署名が正しいか検証」に修正(r10670)
RFC 4252 に「check whether the signature is correct」とあり、公開鍵を使うことを明示するためこのようにしました。
shared secretそのものが使われるのではなく、ネゴシエーションで決定した暗号化方式での暗号の初期化に使われる、というイメージでしょうか? 暗号化方式ごとにshared secretがどのように使われるかまでは書ききれないと思うので、 「これ以降の通信は暗号化される」に変更しました。
r10477 で 4-stable にコミットしました。
チェックをお願いしたいです。
https://twitter.com/ttdoda/status/1192418059119558656
すべてのデータを正しく書こうとすると、結果的にRFCの図説になりそうですね(あると資料としてわかりやすくて助かりますが)。
また、フローのすべての分岐を書こうとするとパターンが結構ありそうですね。