![見出し画像](https://assets.st-note.com/production/uploads/images/128981060/rectangle_large_type_2_9d74f5b563a0c849e46822a5a47b4ba3.png?width=1200)
(恥)GitHubのユーザIDとssh-key の関係を誤解していた。
今回は小ネタで、最近の失敗話である。
私は複数のGitHubアカウントと複数の開発マシンを使い分けている。一つの開発マシンの中から、プロジェクトに応じて、異なるアカウントでGitHubにアクセスすることもある。
最近、とある開発マシンのディレクトリを整理していたら、なぜかそのマシンだけ、特定のGitHubアカウントに限ってリポジトリから clone できなくなってしまった。'repository not found' などとエラーが出てしまうのだ。別のマシンではOKなのに。
例によって ssh-key の設定の問題だろう、と思って確認したが(この時点での私の理解では)問題はない。念のため、GitHub側に登録していた ssh-key を削除して、再度登録しなおしてみたりしたがだめだった。
結論としては、私のGitHubの認証に対する理解が間違っていることがわかった。(誤解に気づいたのは、`$ssh -T git@github.com` で認証テストしていたときだ。私の想定とは違うID名で `Hi <user-id>, ….` というメッセージが出たのである。)
わりと同じような誤解をしている人がいそうな気がするので、恥ずかしいけど、ここに書いておこうと思う。
私の間違っていた認識
以下のように誤解していた。
(誤)GittHubのユーザ認証は、以下のように行われているはず:
クライアント側の git config 設定の user.email 値に基づいて認証しようとするIDを決める。
上記IDに対して、GitHub側に登録されている ssh-key をクライアント側の ssh-key と順次鍵の照合を行い、合致したら認証OKとする。
つまり私は、「ユーザIDが先、sshは後」だと誤解していた。
上記のように誤解していたので、GitHubにアクセスしたいクライアントマシン毎に ssh キーを生成し、それをすべて GitHub に登録していた。
正しい認識(実際のGitHubの挙動)
(正)以下のようにGitHubの認証は動いているようだ:
まず、ローカル側にある ssh-key(一つまたは複数。普通は ~/.ssh 配下にある)を候補として、ユーザIDに関係なく、GitHub側に登録されている全ての ssh-key からマッチするのものがあるかどうか調べる。
少なくとも1つマッチする ssh-key が見つかって鍵の照合に成功したら、その key に紐づいているユーザIDが認証成功したものとなる。2つ以上の key がマッチする場合、2つ目以降は無視される。
もし、一つの ssh-key が複数のユーザIDに紐づいている場合、どれか一つのユーザIDがGitHubによって選ばれ、それが認証成功したものとなる。このとき、どのユーザIDが選ばれるのかの規則は不明。どのIDについて認証させたいかを指定することはできない。
つまり、正しい挙動は「ssh先で、ユーザIDが後」なのである。分かってみれば当たり前で、ssh が先であれば、 ssh が git 側の設定に依存することはありえない。git の user.email の設定が*無視*されるのも道理だ。
なお、私のトラブルは上記の「3.」によって起こっていた。マシン毎に ssh-key を作っていたので、同じキーを複数のユーザID内に置いていたのだ。
GitHub複数アカウントにおける、正しい ssh-key 運用
以下のようにするのが正しい方法の一つ。(他にもあれば教えてください。)
GitHub ID一つにつき、ssh-key を一つだけ作る。(複数作ることも可能だが、混乱の元なのでオススメしない。)
複数の開発マシンを使う場合、上記の ssh-key をコピーして使う。
一つの開発マシンから、複数のGitHub IDにアクセスしたい場合は、.ssh/config ファイルにホスト名エリアスを設定して対応する。(以下に例を示す。)
例:.ssh/config の設定例。2つの GitHub アカウントを使う場合。user1とかuser2 というのはダミーのユーザIDである。実際には自分が使うIDに置換すること。
Host github_user1
HostName github.com
User git
IdentityFile ~/.ssh/id_github_user1
Host github_user2
HostName github.com
User git
IdentityFile ~/.ssh/id_github_user2
この設定により、1つ目のアカウントでGitHubにアクセスしたい場合は以下のようにホストアドレスを指定する。
$git clone git@github_user1:<path_to_repository>
2つ目のアカウントなら:
$git clone git@github_user2:<path_to_repository>
である。
少々面倒だが、複数アカウントを使い分けるには仕方がない。
今回の話は以上である。
お読みいただきありがとうございました。