5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GitHubリポジトリごとに別のssh鍵を使う

Last updated at Posted at 2021-10-22

概要

「ビルドを自動化したい」といった理由のため、ひとつの端末で、複数の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鍵を使っていることすら忘れてしまえます。

5
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?