woshidan's loose leaf

ぼんやり勉強しています

公開鍵認証について本気出して考えてみた

考える前に分かってないんかい!という突っ込みは無しの方向で。

ssh-keygenでコマンドを打ち込んでから公開鍵認証を行うまでに持っていた理解が、

  1. rsaで暗号化(公開鍵)-複号化(秘密鍵)を行うためのキーの鍵を作ります。そのときに、パスフレーズを使います。
  2. 公開鍵と秘密鍵はそれぞれ間接的にパスフレーズの情報を持っています。
  3. 秘密鍵を接続したいサーバの公開鍵で暗号化して送って、
  4. 秘密鍵と公開鍵のパスフレーズの情報から同一のペアと同定して……

というフローだと何となく妄想していたのですが、

秘密鍵が秘密になってないですね、これ(笑...えない!)。

どっとインストールの説明だと、公開鍵、複雑なパスワードみたいなものだと言われていたのだが、 なんだか違う気がしますし、

もう少しきちんと調べてみました。

http://sourceforge.jp/projects/winscp/wiki/public_key

上記サイトを参考にもう少し自分用に分かりやすく書き直すと、以下のフローになります。 別にリモートサーバでなくてもいいんですけど、ローカルマシンからVPSとかリモートのマシンへ接続してると考えるほうが分かりやすかったので。

  1. リモートサーバへログインユーザ名とidentifyfile(秘密鍵)名を指定して、サーバへssh接続したいとリクエストを送ります*1
  2. リモートサーバはログインユーザ名から認証に使う公開鍵を選んで*2、ランダムなデータをその鍵で暗号化して、ssh接続を申し込んできたユーザへ送り返します
  3. ユーザは1で暗号化されたデータを受け取って自分の秘密鍵(1で指定)で複号します
  4. 複号したデータをリモートサーバへ送り返します。このデータは暗号化されていないわけですが、その場限りのランダムなデータなので特に問題ないと思います
  5. リモートサーバは4.で送信されてきたデータと2.で暗号化する前のデータが同一なら、ユーザが正式な鍵を持っているとして、認証を通します

なんていうか、認証用のデータを送るのは接続先のサーバ側からなんですね、という感じでした。

*1:このとき、接続元のローカルマシンの~/.ssh/configファイルに接続先のサーバのホストにたいしてログインするユーザとそのユーザの秘密鍵のパスを書いておくとこの指定は書かなくていいです

*2:ユーザと認証用公開鍵ファイルの対応は~/.ssh/authorized_keysに書きます。authorized_keysは公開鍵ファイルをコピーして作るよ、と説明されますが、1つの公開鍵ファイルの中身は、とても長い鍵の部分と接続元のホスト名/ユーザ名の1行の文となっていて、これが1つ分のユーザアカウントに対する公開鍵とユーザ情報の対として扱われるからです。複数の鍵を登録したい場合は、最初に登録した鍵の下の行に追記していけばいいんですね。