SSH キーの複数管理の設定手順をまとめてみた

エンジニアのみなさま、日々の学習本当にお疲れ様です！
また本記事まで足を運んでいただき本当に感謝です。
約3分程度で読めるので最後まで読んでもらえると幸いです。

# はじめに

「複数のGitHubアカウントのSSH管理」を設定するにあたって理解が足りていない箇所があり、情報収集も少し手こずったため、備忘も兼ねて手順をまとめてみました。

# 前提

- Macの操作手順
- 既にGitHubアカウントAで秘密鍵・公開鍵が設定されている
    - **秘密鍵ファイル名：id_ed25519**
    - **公開鍵ファイル名：id_ed25519.pub**
- ssh用のconfigファイルは既に作成されている
- GitHubアカウントBの秘密鍵・公開鍵は未設定
- GitHubにて「アカウントBの登録」と「リモートリポジトリの登録」は出来ている
- リモートリポジトリに紐付けるローカルリポジトリも存在する
- 管理したいGitHubアカウントBのメールアドレスは「hoge@fuga.hoge」、秘密鍵のファイル名は「id_ed25519-account-b」とする

# 手順

### ①アカウントB用の公開鍵と秘密鍵を作成する

```:ターミナル
ssh-keygen -t ed25519 -C "your_email@example.com" -f <秘密鍵のファイル名>

# 今回のケースの場合
ssh-keygen -t ed25519 -C "hoge@fuga.hoge" -f id_ed25519-account-b
```
-fをつけない場合「id_ed25519」と「id_ed25519.pub」ファイルが生成されます。
今回の場合は既に上記2ファイルが存在するため、上書きしても良いか聞かれます。
必ず-fをつけてGitHubアカウントB用の秘密鍵・公開鍵ファイルを作成しましょう。
以下のコメントが表示されるので、Enterを押します。

```:ターミナル
> Enter a file in which to save the key (/Users/YOU/.ssh/id_ALGORITHM): [Press enter]
```

以下のコメントが表示されるので「Enter2回」 もしくは 「好きなパスフレーズを2回入力」します。セキュリティを強化するには後者を選択しましょう。
```ターミナル
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
```

以下コマンドでファイルが生成されているかを確認します。

```:ターミナル
cd ~/.ssh
ls
```

```:ssh内
# GitHubアカウントA用のファイル
id_ed25519 id_ed25519.pub

# 以下2ファイルが新たに生成される
id_ed25519-account-b id_ed25519-account-b.pub 
```

### ②SSH キーをssh-agentに追加する

```ターミナル
$ eval "$(ssh-agent -s)"
> Agent pid <ランダムな値が生成される>
```
上記コマンド後、以下コマンドでconfigファイルを開き、GitHubアカウントB用の設定を追加します

```ターミナル
open ~/.ssh/config
```

```diff_PHP:configファイル

# GitHubアカウントA用の設定
Host github-account-a
  HostName github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519


# 以下、GitHubアカウントB用の設定を追加する
+ Host github-account-b
+  HostName github.com
+  User git
+  AddKeysToAgent yes
+  UseKeychain yes
+  IdentityFile ~/.ssh/id_ed25519-account-b
```
上記、GitHub用Bの設定を追加後、catコマンドで生成したファイルの中身を確認してみましょう。

```:ターミナル
cd ~/.ssh
cat id_ed25519-account-b
```

```:id_ed25519-account-bファイル
-----BEGIN OPENSSH PRIVATE KEY-----
<秘密鍵の内容が記載されている>
-----END OPENSSH PRIVATE KEY-----
```

id_ed25519-account-bファイルの内容をssh-agent に追加して、パスフレーズをキーチェーンに保存します。

```:ターミナル
ssh-add --apple-use-keychain ~/.ssh/id_ed25519-account-b
```

### ③GitHubアカウントBへSSH キーを追加する

以下コマンドで公開鍵ファイル（id_ed25519-account-b.pub）の内容をコピーします。

```:ターミナル
pbcopy < ~/.ssh/id_ed25519-account-b.pub
```

コピー後、GitHubアカウントBにある「Settings」をクリックする

![スクリーンショット 2024-07-15 16.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/90fe7be9-e29d-c781-1bc5-44ee38c36b68.png)

手順① ~ ⑤を実施する

![スクリーンショット 2024-07-15 15.05.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/853d9ef7-165f-cec6-f7b0-c54e46d91e28.png)

![スクリーンショット 2024-07-15 15.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/ff4d8b73-489b-fedf-4be7-d977a873da40.png)

### ④リモートリポジトリの接続先を確認する

```:ターミナル
cd <対象のローカルリポジトリまで移動する>

# リモートリポジトリを確認する
git remote -v

# ssh/configで設定したHost名に変更する
git remote set-url origin github-account-b:<GitHubアカウント名>/<対象のリポジトリ名>
```

### ⑤SSHの疎通を確認する

```:ターミナル
cd <対象のローカルリポジトリまで移動する>

# リモートリポジトリを確認する
ssh -T github-account-b

> Hi <GitHubアカウント名>! You've successfully authenticated, but GitHub does not provide shell access.
```

# さいごに
今回はSSH関連の理解を深める事ができました。
GitHubアカウント単体のSSH設定に関しては、GitHub公式の手順通り進めれば難なくできそうです。

この投稿が誰かの一助になれば幸いです...！

### さいごまでご覧いただきありがとうございました！

# 参考記事
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/testing-your-ssh-connection

https://zenn.dev/darutani/articles/multiple_github_accounts_with_ssh_on_single_pc

https://zenn.dev/nikaera/articles/ssh-config-github

# おまけ

唐突ですが弊社のご紹介もさせてください。

▼ コーポレートサイト

https://prum.jp/

▼ Wantedly求人

https://www.wantedly.com/projects/626662

弊社メンバーは学習した内容を日々Qiitaの記事にアウトプットしております。
弊社にご興味のある方、まずは求人を見てみてください！
ご応募お待ちしておりますー！