概要
「ビルドを自動化したい」といった理由のため、ひとつの端末で、複数のgithubアカウントを使いたいことがあります。その場合、githubに対して複数のssh鍵でアクセスすることになります。その設定方法について説明します。
ここではUNIX系端末(macOS含む)での利用を前提とします。
なぜ複数のssh鍵が必要なのか
githubにssh経由でアクセスするには、githubに対し事前に自分のssh公開鍵を設定しておく必要があります。
普段とは別の、もうひとつのgithubアカウントでssh経由でアクセスする場合も、githubに対し、事前に自分の別のssh公開鍵を設定しておく必要があります。なぜなら、他のgithubアカウントに既に設定されているssh公開鍵は、別のアカウントへの設定であろうとも、もはやgithubには登録できないからです。言い換えれば、githubに登録するssh公開鍵は、githubの全ユーザに対しユニークな必要があります。
別のssh鍵を作る
というわけで、普段づかいとは別のssh鍵を作りましょう。
以下、hogeなんたら
と書かれている部分は、あなたが扱おうとしているプロジェクトの名称などに適宜読み替えてください。
- 鍵の暗号アルゴリズムはed25519を使いましょう。早くて強いです。ただし(後述)
- 何のため作った鍵なのか後でわかるよう、きちんとコメントを付けましょう。
- 既存の鍵とは別のファイル名も指定します。
- パスフレーズはなし(空文字列)でok
ssh-keygen -t ed25519 -C 'ssh key for hogeproj' -f hogeproj-key-ed25519 -N ''
ただし、iOSアプリの開発などで、Xcodeに含まれているgit機能も使いたい場合は要注意。バージョン13.3以前のXcodeはed25519鍵に対応していません(リリースノート)。開発上の都合で13.3以前のXcodeを使う必要があり、さらにXcodeのメニューからgitを使いたい場合は、残念ながらRSA暗号を使いましょう。ビット数はせめて4096にしておきます。
ssh-keygen -t rsa -b 4096 -C 'ssh key for hogeproj' -f hogeproj-key-rsa4096 -N ''
私は、Xcodeメニューのgit機能は使わず、shellから単体のオリジナルのgitコマンドのほうを使うことにしたので、ed25519鍵のほうで進めます。
これで、~/.ssh
の中に、ssh秘密鍵hogeproj-key-ed25519
とssh公開鍵hogeproj-key-ed25519.pub
が作られました。
念のため、~/.ssh
自体はパーミッション700, hogeproj-key-ed25519
はパーミッション600, hogeproj-key-ed25519.pub
はパーミッション644になっていることも確認しておきましょう。
これらのファイルは、安全なところにバックアップもしておきましょう。私は1passwordの保管庫に入れました。
githubにssh公開鍵をセットする
github.comに、もう一つのアカウントのほうでログインしておき、SSH and GPG keysにアクセスし、SSH keysのセクションで、New SSH Key
をクリックします。
Titleには、何のための鍵なのかの説明を記入。上の例にならうとssh key for hogeproj
など。
Keyには、ssh公開鍵の「中身」をそのままペーストします。
Add SSH Key
をクリックして登録します。
登録しようとする内容はgithubがわもきちんとチェックしてくれますし、おかしい場合はエラーを返してくれますので、うまくいかなかった場合はエラー内容をきちんと読みましょう。
~/.ssh/configを設定
git cloneするとき、使うssh鍵もオプション指定できたなら、本当は便利なのです。たとえばgit clone -i ~/.ssh/hogeproj-key-ed25519 git@github.com:hogerepos/hogesrc.git
といった感じに。
でも残念ながら、gitコマンド自体には、複数のssh鍵を使い分けるための機能はありません。
いま実行するこのgitではsshオプションはこうしてほしい、といった指定を、環境変数やオプションで与えることはできるのですが、これはあくまでも一時的な指定です。後日またここでgit pullなどするときには、もうその指定は効きません。「こんなリポジトリないぜ? 何いってんの?」といった感じのエラーになってしまいます。
ではどうするか。~/.ssh/configに、「このホストにsshするときはこの鍵を使う」という指定を入れる方法がいちばんましです。~/.ssh/configをエディタで開き、以下を追記します。
Host hogeremote
Hostname github.com
User git
IdentityFile ~/.ssh/hogeproj-key-ed25519
これで、hogeremoteという(仮想的な)ホストにsshする場合は、本当にsshアクセスすべきホストはgithub.comで、sshユーザはgitで、秘密鍵は~/.ssh/hogeproj-key-ed25519を使うんだよ、というルールを定義できました。
git cloneする
git cloneしてみましょう。github.comの対象リポジトリにアクセスし、SSHを用いたclone urlを入手します。
clone urlは、通常git@github.com:hogerepos/hogesrc.git
といった書式になっています。
このgithub.com
の部分を、さきほど~/.ssh/config
で定義した、仮想的なホストhogeremote
に置き換えます。cloneしてみましょう。
git clone git@hogeremote:hogerepos/hogesrc.git
こうしてcloneしたフォルダの中では、今後は、普通にgitコマンドを使うだけで、専用githubアカウントと専用ssh鍵が自動的に使われます。専用githubアカウントと専用ssh鍵を使っていることすら忘れてしまえます。