プログラミング
GitHubが突然SSHキーを拒否した(修正は.pubファイルだった?)
GitHub suddenly rejected my SSH key (the fix was a .pub file?) (thorsell.io)
要約
筆者のメインラップトップで突然Gitのプルができなくなり、「Permission denied (publickey)」エラーが発生した。設定やキーに問題はないように見えたが、SSH秘密鍵に対応する`.pub`ファイルが存在しないことが原因だった。`.pub`ファイルの存在がOpenSSHの認証フローを変更し、GitHubのサーバーが要求する形式になったことで問題が解決した。これはGitHub側のSSHサーバーソフトウェアの変更を示唆している。
全文翻訳
メインラップトップでgit pullが突然動作しなくなった。Permission denied (publickey) というエラーが、何の前触れもなく発生したのだ。私は何も変更していなかったし、キーはGitHubに登録されたままだった。別のラップトップ(別のキーを使用)から同じリポジトリをプルすることは問題なくできた。この深いトラブルシューティングのセッションは省略しよう。
キー自体は数学的に健全だった(openssl rsa -check は RSA key ok と表示した)。署名アルゴリズムは最新の rsa-sha2-512 で、私の ~/.ssh/config もクリーンで、GitHub のステータスページもすべてグリーンだった。それにもかかわらず、Permission denied が発生した。
修正は、恥ずかしいほど些細なことだった。私の ~/.ssh/github_rsa は、ラップトップを再インストールして以来、対応する .pub ファイルなしで存在していた。それを生成したところ、認証が再び機能するようになった。
$> ssh-keygen -y -f ~/.ssh/github_rsa > ~/.ssh/github_rsa.pub
私も信じられなかったので、.pub ファイルがある場合とない場合で6回ずつテストした。12回中12回、.pub ファイルがない場合は拒否され、.pub ファイルがある場合は受け入れられた。
なぜそんなことが重要なのか?それは、.pub ファイルが存在すると、クライアントが最初にプローブ(公開鍵を提示し、サーバーの承認を待つ)してから署名を行うためだ。秘密鍵のみの場合、OpenSSH はプローブをスキップし、完全に署名された認証リクエストを直接送信する。どちらのフローも RFC 4252 によれば完全に合法であり、標準の sshd は両方を受け入れる。しかし、今日の GitHub は、明らかにそうではない。
GitHub 側で何か変更があったのだろうか?私の予想では、そうだ。
私のデバッグログに表示されるサーバーバナーは 6a2c000 で、GitHub の SSH フロントエンドは歴史的に babeld-<hash> として自身を識別していた。これは新しいサーバーソフトウェアの匂いがする。直接署名された公開鍵リクエストを拒否するようなものだ。朝はすべてうまくいっていたのに、何も変更していないマシンで1時間後に何もかもがうまくいかなくなった理由を完璧に説明できる。
誰か他にこの問題に遭遇した人はいるだろうか? 6a2c000 が何であるか知っている人は?教えてほしい。それまでの間、秘密鍵にはその .pub の兄弟ファイルがあることを確認してほしい。