GitHub Permission Error 「The requested URL returned error: 403」　解消備忘録 

# 背景
GitHubで会社用と個人用のアカウントを分けて運用し始めたのですが、SSH設定が適切に行われておらず、`The requested URL returned error: 403` エラーが発生しました。このエラーを解消するために、正しいSSH設定とリモートリポジトリのURL設定を記録します。


# 前提条件

###### 用語説明
例文内の `username` はGitHubアカウント名を指します。

:::note
Goalは会社用と個人用のSSH設定なので、両方のアカウントについて同じ手順を実行します。まずは会社用（company）の設定を行い、その後、同じ手順で個人用（private）の設定を進めてください。
:::

`~/.ssh/` に以下のファイルが存在します。
###### SSHキーファイル
`company` / `company.pub`: 仕事用アカウントに対応するSSHキー
`private` / `private.pub`: 個人用アカウントに対応するSSHキー

###### 設定ファイル
`Config`: SSH設定ファイル
###### その他ファイル
`known_hosts` / `known_hosts.old`: 接続したことがあるホストの情報

# 実行
#### 1. SSH設定の確認
`~/.ssh/config` はSSHの設定ファイルで、SSH接続時の設定を簡略化するために使用されます。このファイルが存在しない場合は、手動で作成し、必要な設定を書き込みます。


```text:~/.ssh/config
# company
Host company
    HostName github.com
    User git
    IdentityFile ~/.ssh/company
    AddKeysToAgent yes
    UseKeychain yes

# private
Host private
    HostName github.com
    User git
    IdentityFile ~/.ssh/private
    AddKeysToAgent yes
    UseKeychain yes
```
| 項目               | 説明                                                                 |
|-------------------|----------------------------------------------------------------------|
| Host `company`    | SSHプロファイル名を指定します。この名前をGitリモートURLで使用します（例: `git@company`）。 |
| HostName `github.com` | 接続先ホスト名を指定します。この場合、GitHubのホスト（`github.com`）を指します。        |
| User `git`        | 接続に使用するユーザー名を指定します。GitHubでは常に`git`を指定します。               |
| IdentityFile `~/.ssh/company` | SSH接続に使用する秘密鍵のパスを指定します。この例では`~/.ssh/company`が使用されます。 |
| AddKeysToAgent `yes` | SSHキーをエージェントに追加する設定です。`yes`にすると、キーが自動でSSHエージェントに追加されます。 |
| UseKeychain `yes`   | macOSでキーをキーチェーンに保存する設定です。保存されると次回以降パスフレーズの入力が不要になります。 |


###### 確認ポイント
* IdentityFile が正しく `~/.ssh/company` `~/.ssh/private` を指していること。
* HostName が `github.com` になっていること。
#### 2. SSHキーの生成
```bash
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
| オプション  | 説明                                   |
|:-----------|:-------------------------------------|
| -t rsa     | 鍵のタイプをRSAに指定。               |
| -b 4096    | 鍵の長さを4096ビットに設定。          |
| -C "your_email@example.com" | GitHubアカウントに関連付けるメールアドレス。 |


* 会社用キー
`/Users/yourname/.ssh/company`
* 個人用キー
`/Users/yourname/.ssh/private`

#### 3. 公開鍵の確認と登録
* 秘密鍵: `~/.ssh/company` または `~/.ssh/private`
* 公開鍵: `~/.ssh/company.pub` または `~/.ssh/private.pub`

GitHubにログインし、[SSHキー設定ページ](https://github.com/settings/keys "setting-keys")にアクセス。
<b>公開鍵</b>の内容をコピーして、「New SSH Key」から登録します。

###### 確認ポイント
* 公開鍵が `ssh-rsa` または `ecdsa-sha2-nistp256` などの形式で始まること。
* 最後に、鍵を生成した際に指定したメールアドレスが表示されること


#### 4. SSHキーをエージェントに追加
SSHキーをエージェントに追加することで、リモートリポジトリへの接続時にSSHキーを自動で使用できるようになります。この設定により、毎回パスフレーズを入力する必要がなくなり、操作がスムーズになります。

```bash
ssh-add ~/.ssh/company
```
```bash:追加されたキーを確認
ssh-add -l
```
```bash:成功時の応答
4096 SHA256:... /Users/yourname/.ssh/company (RSA)
```

#### 5: リモートリポジトリのURLを設定
リモートリポジトリのURLをSSHプロファイル形式に設定することで、会社用アカウント（`company`）と個人用アカウント（`private`）を簡単に切り替えて運用できます。この設定により、誤ったアカウントで接続するリスクを防ぎます。

```bash
git remote set-url origin git@company:username/repository-name.git
```
```bash:設定確認
git remote -v
```
```bash:成功時の応答
origin  git@company:hsnyt/home.git (fetch)
origin  git@company:hsnyt/home.git (push)
```

#### 6. 接続テスト
```bash
ssh -T git@company
```
```bash:成功時の応答
Hi username You've successfully authenticated, but GitHub does not provide shell access.
```