【GitHub】複数のsshキーを登録している際のclone失敗について

# はじめに
## 目的
　プロジェクトによってSSHキーを分けることで複数所持している場合、特にGitHubのキーが複数存在するときに、cloneコマンドが動かない場合がある。SSHキーの数はそのままにcloneできるようにする。
　なお、本件はUNIXにて実施している

## 結論
　GitHubのclone引用コピペをSSHキーconfig内容に注意しながら書き換えて実行する。[Host]はhostnameではない。
```:Git cloneコマンド
git clone git@[Host]:[GitHubユーザー名]/[リポジトリ名].git
```


# 目次
1. [準備](#1-準備)
    - SSHキーの作成
    - configの設定
1. [接続確認](#2-接続確認)
    - SSH接続テストエラー例
1. [clone](#3-clone)


# 手順
## 1. 準備
　まず、SSHキーをEd25519暗号にて作成する。詳細は以下
<details><summary>SSHキーを作成</summary><div>

　下記コマンドにてキーを作成する。例はEd25519鍵。
```:SSHキーの作成コマンド
$ ssh-keygen -t ed25519
```

すると以下の表示が出力され、入力モードになる。
複数の鍵を所持している場合は、ここで鍵の名前を入力することになると思われる。
```:SSHキー名の設定
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):         
```

その後、パスフレーズの設定があり、作成が完了する。
```:その他設定と作成完了表示
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_hoge
Your public key has been saved in id_hoge.pub
The key fingerprint is:
SHA256:Np4scfKVKrMlSwOYF75Qb/F+6CtHzu9IP27E4xWJNR0 User@DESKTOP1
The key's randomart image is:
+--[ED25519 256]--+
|             .E. |
|            o .  |
|    o .    o o   |
|   = o o  ..o    |
|  + + = S.o  .   |
|   o + X.*+ .    |
|    . B+@o.o     |
|     ..%+++      |
|      oo+*=.     |
+----[SHA256]-----+
```
その後、GitHub上でSSHキーを登録する。
右上のアイコン → Setting → SSH and GPG keys → New SSH key ボタン
から、先程作成したid_hoge.pubの記述内容をコピペする。

</div></details>

### configの設定
　~/.ssh/におけるSSHキーのconfigを設定する。元々2つのキーが存在している状態で、上記1のようにしてid_hogeキーを追加作成した場合を考える。ディレクトリ内は以下のようになっている。
```:~/.ssh
-rw-r--r-- 1 user user  304 Aug 21 14:15 config
-rw------- 1 user user  411 Aug 20 14:09 id_git_ed25519_1
-rw-r--r-- 1 user user  101 Aug 20 14:09 id_git_ed25519_1.pub
-rw------- 1 user user  411 Aug 27 14:10 id_git_ed25519_2
-rw-r--r-- 1 user user  101 Aug 27 14:10 id_git_ed25519_2.pub
-rw------- 1 user user  411 Aug 27 14:11 id_hoge
-rw-r--r-- 1 user user  101 Aug 27 14:11 id_hoge.pub
-rw-r--r-- 1 user user 1110 Aug  3 13:03 known_hosts
```

configにid_hogeキー設定を追記する。例として下記のように記述したとする。
注意点として、GitHubで用いる場合は、hostnameは接続先ホスト名もしくはIPを入力するため"github.com"、
UserはGitHubに登録しているユーザーネーム等ではなく"git"で設定しなければならない。
```:~/.ssh/config 例
Host hoge
    hostname github.com
    IdentityFile ~/.ssh/id_hoge
    User git

Host GitHub-Repository1
    hostname github.com
    IdentityFile ~/.ssh/id_git_ed25519_1
    User git

Host GitHub-Repository2
    hostname github.com
    IdentityFile ~/.ssh/id_git_ed25519_2
    User git
```

## 2. 接続確認
　実際に作業を実施するディレクトリにて接続確認を実施する。その際、~/.ssh/configに従ったコマンドにする必要がある。
```:SSH接続確認コマンド
$ ssh -T git@[Host]
```
例として、上記configに従って表記すると下記のようになる。
```:SSH接続確認コマンド例
$ ssh -T git@hoge
```
接続が成功した場合は下記のような表示が出力される。
```:SSH接続成功
Hi [GitHub ユーザー名]! You've successfully authenticated, but GitHub does not provide shell access.
```
### SSH接続テストエラー例
もし何か問題がある場合は下記のようなエラーが出ることがある。
```:エラー例①
git@github.com: Permission denied (publickey).
```
1. Userが"git"になっていない
1. GitHub側からキーが見つからない
等が考えられる。

```:エラー例②
ssh: Could not resolve hostname hoge: Name or service not known
```
~/.ssh/configにおいて登録されていないHostを入力すると出力される。

## 3. clone
　接続確認が完了した場合は、同様の注意点を意識するとcloneできる。実際のclone時にはGitHubブラウザにおける各リポジトリにてcodeボタンを押したときに出るclone用のウィンドウのSSHタブにて表示されているコードをコピーペーストすることになると思われるが、その際に[Host]に当たる部分は忘れずに書き換える必要がある。
```:cloneコマンド
$ git clone git@[Host]:[GitHubユーザー名]/[リポジトリ名].git
```
上記例を踏まえると下記のようになる。
```:cloneコマンド例
$ git clone git@hoge:GitHub-User/hogehoge.git 
```


# 参考
SSH接続のテスト
https://docs.github.com/en/authentication/connecting-to-github-with-ssh/testing-your-ssh-connection

なぜ GitHub への 公開鍵認証での SSH は User git で接続できるのか？
https://zenn.dev/junki555/articles/508c474f72e8c8