git cloneでPermission deniedされたときの対策

# はじめに

git cloneをしようとしたとき、以下のようなエラーが起こったことはないでしょうか。

```powershell
PS E:\workspace\Python\latin-descendant-predictor\data\colab> git clone git@github.com:halhorn/deep_dialog_tutorial.git
Cloning into 'deep_dialog_tutorial'...
Load key "C:\\Users\\paka\\.ssh\\": Is a directory
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

私も同じエラーに直面したので、本記事ではその解決に至った経緯を記載します。
ユーザーの環境によっては解決策が違って役に立たないかも知れませんが、誰かの一助になることを望みます。

# 正しいサーバーに接続しているか確認
git@gtihbu.comなど、サーバー名を打ち間違えていると当然ですが接続できないのでそこをまず確認します。[1]
```shell
$ ssh -vT git@github.com
> OpenSSH_8.1p1, LibreSSL 2.7.3
> debug1: Reading configuration data /Users/you/.ssh/config
> debug1: Reading configuration data /etc/ssh/ssh_config
> debug1: /etc/ssh/ssh_config line 47: Applying options for *
> debug1: Connecting to github.com port 22.
```
ssh関連のコマンドがWindowsはあまり揃っていないので、私はWSL2を使ってやりました。
以下、特に説明がない限りWSL2を使っているとします。
ログが見切れますが、その場合はファイルに出力してください。
```shell
ssh -vT git@github.com > log.txt
```

# 使用中のキーを持っていることを確認
SSHを使うには、プライベートキー・パブリックキーのペアが必要なので、その準備をします。
まず、ssh-agent を有効にします。
```shell
$ eval "$(ssh-agent -s)"
> Agent pid 59566
```

次に、既にプライベートキーを生成しSSHに読み込ませているかを確認します。
```shell
$ ssh-add -l -E sha256
> 2048 SHA256:274ffWxgaxq/tSINAykStUL7XWyRNcRTlcST1Ei7gBQ /Users/USERNAME/.ssh/id_rsa (RSA)
```
ここで上記のように長い英数字が表示される場合、プライベートキーはSSHに読み込まれています。
表示されない場合、読み込まれていません。その場合、キーを新たに作成します。

# SSHキーの生成
`ssh-keygen`でキーを生成します。[2]
```shell
$ ssh-keygen -t ed25519 -C "your_email@example.com"
> Generating public/private algorithm key pair.
```
ed25519は何でも結構です。"your_email@example.com"は自分のメールアドレスにしてください。
```shell
> Enter a file in which to save the key (/c/Users/you/.ssh/id_algorithm):[Press enter]
```
`/c/Users/you/.ssh/id_algorithm`が既定の場所となりますので、Enterを押してください。
```shell
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
```
パスワードを同じものを2回入れてください。

# SSH キーを ssh-agent に追加
SSH**プライベートキー**をssh-agent に追加します（.pubが付いているものではありません）。
```shell
$ ssh-add ~/.ssh/id_ed25519
```

# SSHキーをGitHubに登録
SSH**パブリックキー**（プライベートキーではないです）をクリップボードにコピーします。[3]
```shell
clip.exe < id_ed25519.pub
```

GitHubの任意のページで右上隅にあるプロファイルの画像をクリックし、次に[設定](Settings)をクリックします。

サイドバーの [アクセス] セクションで、  SSH キーと GPG キー(SSH and GPG keys)をクリックします。

[SSH keys]で、[New SSH key]、もしくは[Add SSH key]をクリックします。

- Title: 分かりやすい説明をつけてください。例えば、「職場のデスクトップ」など
- Key type: Authentication Key
- Key: 先程コピーしたSSHパブリックキーを貼り付けてください

[Add SSH key]をクリックしてください。

# ssh_configの設定

ssh_configの設定をします。Git for windowsの場合
C:\Program Files\Git\etc\ssh\ssh_config
にssh_configがあります。

```
Host github.com
  User git
  HostName github.com
  IdentityFile (プライベートキーのパス)
  IdentitiesOnly yes
```

# 通信の確認
```shell
root@home-PC:/mnt/c/users/paka/.ssh# ssh -T git@github.com
Enter passphrase for key '/root/.ssh/id_ed25519':
Hi Dixhom! You've successfully authenticated, but GitHub does not provide shell access.
```
きちんとGitHubと通信が取れるようです。

# git clone
Powershell
```powershell
PS E:\workspace\Python\latin-descendant-predictor\data\colab> git clone git@github.com:halhorn/deep_dialog_tutorial.git
Cloning into 'deep_dialog_tutorial'...
Enter passphrase for key 'C:\Users\paka\.ssh\id_ed25519':
remote: Enumerating objects: 150, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (15/15), done.
Receiving objremote: Total 150 (delta 8), reused 0 (delta 0), pack-reused 135
Receiving objects: 100% (150/150), 3.59 MiB | 2.04 MiB/s, done.

Resolving deltas: 100% (66/66), done.
Checking connectivity... done.
```

成功しました！

# 総括
原因はSSHキーでした。

# 参考
- [1] https://docs.github.com/ja/authentication/troubleshooting-ssh/error-permission-denied-publickey
- [2] https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
- [3] https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account