結論
複数のGitHubアカウントに対しssh接続するために公開鍵を登録する場合、~/.ssh/id_rsa.pub
の公開鍵は登録しない方が良い。
状況
個人用のGitHubアカウントと、アルバイト用のGitHubアカウントがあって、sshでそれぞれのリポジトリにpushする。
アカウントの切り替えが面倒なので、出来るだけgit push origin master
みたいな感じでアカウントの切り替えを気にせず作業を行いたかった。
自分の環境
macOS 10.14.1
設定
この場合の設定方法については先駆者様の記事がいくつかあって、要点をまとめると
- 鍵を生成する
- GitHubに公開鍵を登録する
-
~/.ssh/config
に必要事項を書き込む - ローカルリポジトリのoriginアドレスを書き換える
- 必要であればlocalのコミットユーザ名、メールアドレスを変更する
といったような感じである。
詳細はこの記事の管轄外なので、この情報を欲している人は各自検索してほしい。
正常に動作するかはssh -T [configのHost]
でチェックできる。
正常であれば、下記のようなレスポンスが期待される。
% ssh -T [configのHost(個人用)]
Hi [個人用アカウント名]! You've successfully authenticated、 but GitHub does not provide shell access.
% ssh -T [configのHost(仕事用)]
Hi [仕事用アカウント名]! You've successfully authenticated、 but GitHub does not provide shell access.
問題発生
ところが、自分の作業環境では
% ssh -T [configのHost(個人用)]
Hi [個人用アカウント名]! You've successfully authenticated、 but GitHub does not provide shell access.
% ssh -T [configのHost(仕事用)]
Hi [個人用アカウント名]! You've successfully authenticated、 but GitHub does not provide shell access.
と、仕事用のHostでssh接続しても個人用のアカウント名が表示される。
要するにどっちのHostでssh接続しても同じGiuHubアカウント名が表示されてしまうわけである。
解決
色々調べた結果、個人用アカウントのssh鍵に~/.ssh/id_rsa.pub
を登録していたのが問題だったらしい。
どうやら、sshを実行するとまず~/.ssh/id_rsa
を先に使用して認証し、次に~/.ssh/config
を確認するようである。
-i identityファイル
公開鍵認証の際にidentity (秘密鍵) を読むファイルを指定します。デフォルトは、プロトコル 1 の場合ユーザのホームディレクトリにある~/.ssh/identity、プロトコル 2 の場合は~/.ssh/id_dsa ,~/.ssh/id_ecdsa ,~/.ssh/id_ed25519および~/.ssh/id_rsaになっています。identity ファイルは設定ファイルによって、ホストごとに指定することもできます。
ssh 日本語マニュアルページ
つまり、configに書いた仕事用の設定が適用される前に、先に個人用の鍵で認証がなされていたようだ。
なので、個人用は個人用で新しく鍵を生成して、GitHubに公開鍵を登録し直したところ、期待されたレスポンスを得ることができた。
補足
上記の引用はそれっぽいのですが、configをチェックする前に~/.ssh/id_rsa.pub
でサーバに認証するかは書かれていないので正確ではありません。
しかし該当箇所は見つからず、かつ挙動はどう考えても推測したものであるため,ここではそうだと仮定しています。