web-dev-qa-db-ja.com

パスフレーズがまだ提供されていない場合、SSHサーバーはどのようにして秘密鍵が正しくないことを知ることができますか?

SSH経由でアクセスしているサーバーがあります。認証は秘密鍵でのみ許可されます。通常、PuTTY経由でログインすると、最初にユーザー名の入力が求められ、次にキーのパスフレーズの入力が求められます。好奇心から、私は新しい秘密鍵を作成しましたが、これはユーザーにとっては無効であるはずであり、パスフレーズもそれに使用しています。驚いたことに、ユーザー名を指定すると、パスフレーズの入力を求められる前に、サーバーにログインしようとしたキーが拒否されました。

秘密鍵のパスフレーズがまだ提供されていない場合、SSHサーバーは秘密鍵が正しくないことをどのようにして知ることができるのでしょうか。

46
vakus

秘密鍵を暗号化しても、公開鍵は引き続き読み取り可能です。 SSH認証 " publickey "メソッドを使用すると、クライアントは各潜在的な公開鍵をサーバーに送信し、サーバーはクライアントにどの鍵が許可されているかを通知して応答します。いずれかのキーが許可されている場合、その後クライアントはメッセージに署名するために秘密鍵を復号化し、秘密鍵の所有権を証明する必要があります。

実験では、サーバーは、提供されたキーのいずれもユーザー名に許可されていないため、秘密キーを復号化する必要はなく、認証はすでに失敗していると応答しました。

83
AndrolGenhald

接続中、クライアントは利用可能なすべてのキーのフィンガープリントをサーバーに連続的に送信します。

サーバーがクライアントに有効なキーが見つかったときに信号を送ると、クライアントはそれらを使用し、必要に応じてパスフレーズを要求します。

デバッグオプションを指定してsshを実行してみます。

ssh -o LogLevel=DEBUG3 user@dest

指紋を探す

ssh-keygen -l -f .ssh/id_rsa

行ごとにauthorized_keysをチェックするには:

while read line;do
    ssh-keygen -l -f <(echo "$line")
  done <.ssh/authorized_keys 
14
F. Hauri