GitHubのSSH認証でハマりました
久しぶりにGitHubに接続したら
このブログを書くきっかけになったFlutter
学習用のプログラムをGitHubにアップしようと久しぶりにアクセスしました。
実は最近GUIばかり使用しているので、コマンドを入力するのは億劫になっています。gitはコマンドラインツールなので、GitHubにはSourceTreeでアクセスしているんです。そこで、抜け出せない沼にはまりました。
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
このような、メッセージが表示されてpushができない状態になりました。ネットで調べてみると結構前からGitHubはパスワード認証からSSH認証に変更されていたようで、ここはネットの力を借りて解決しようと思いましたが、一筋縄で行かなかったのでここに記憶の限り紹介します。
まずはHTTPSからSSHへプロトコルを変更
とりあえず認証プロトコルをSSHに変更しないと始まらないのでSourceTreeからアカウントをSSHに変更した。下の画面はSourceTreeのアカウント選択画面でダブルクリックすると現れる画面でSSHに変更します。
ここから迷路の始まりです。編集ボタンを押してプロトコルを変更すると<アカウント名>-GitHubといった感じのSSHキーを作ってくれます。そのままGitHubのサイトに飛んでくれる優れものです。筆者の環境ではエラーになりましたが、通常うまくいくはず。
筆者はSSHキーをクリップボードにコピーして、自分で貼り付けました。貼り付ける先は、GitHubの自分のアカウントにあるメニューからSettingsを選択して、SSH snd GPG keys を選択してSSHキーを登録しました。
これでGitHubにSSH接続するための公開鍵・秘密鍵の作成と公開鍵をGitHubに登録ができたので、無事に接続といきたいところです。
元々、使えていたのでここに実は油断があったのは3日後に思い知りました。
GitHubとの通信開始
タイトルにあるようにまず通信の確認をしたわけではありません。いきなりpushを試しました。まだエラーになります。Permission denied (publickey).
が眩しいです。
泣く泣く、原因追及の旅は続くのでここで通信の確認をするわけです。
コマンドラインから入力してみます。すると接続は正常にできていました。では、pushできない原因は?謎は深まるばかりです。
またまた、ネットで調べると~/.ssh/configに設定があるらしいので記述の確認してみることにしました。下の画像は訂正したものですがIdentityFile の記述が先にも書きましたがSourceTreeが作成してくれるファイルが<アカウント名>-GitHub.pubなので最初の記述は下のようではありませんでした。標準ではid_rsa.pubらしいです。複数アカウントを使い分けるときに違う名前で使用するらしいですが、よくよく考えてみると複数アカウントを使い分けているわけではないので、標準の名前にしようと思いました。これが成功の第一歩でした。
勇気を出してコマンドラインで
$ mv <アカウント名>-GitHub.pub id_rsa.pub
としました。
パーミッションを確認し
$ chmod 644 id_rsa
で読み出しを許可します。そしてエディタで~/.ssh/configを編集しました。上記の画像のようにIdentityFile を標準の名前id_rsa.pubにしました。
これでもpushできない
まだpushできません。途方に暮れていたら、ふと立ち寄ったサイトの記述が目に止まりました。下図をよく見てもらえると、ぼかしを入れてあるので分かりにくいですがパスがSourceTreeでは入力されているのですが、GitHubのリポジトリのクローンにあるパストが一致していなかったのです。
このパスをGitHubからコピーしてSourceTreeのパスに貼り付けると、なんと4日間できなかったpushができました。
参考にしたサイトを紹介します
みなさんありがとうございます。本当に助かりました。