Git CloneでPermission Denied(PublicKey)で一通りググったけど解決しなかった

いつものようにssh-keygenして、またはしないで
なじみのGitリポジトリ管理ツール（ここではGitLab）で任意のリポジトリをgit cloneしようとしたときのこと…

# 起こったこと

高スペックPCを手に入れたのでGitやらエディタやら初期設定中。
「プロジェクトのソースコード、ローカルに落とすかー」

```
$git clone ssh://*****
```

するとエラーでcloneできなかった。。。
エラーメッセージには親の顔より見たお馴染みの文面が。

```
$Error:Permission denied（PublicKey）
```

こういうとき、皆さんもいろんな観点で何が問題かを特定しに行くと思いますが
自分の経験上、今までは以下のような対策をとっていた。

<dl>
  <dt>keygenしたssh鍵に権限付与し忘れor付与したけど戻ってしまっている</dt>
  <dd>よくやるやつ。</dd>
  <dt>configファイルに半角スペース等のごみ混入</dt>
  <dd>コピペミスとか手書きで修正した箇所にスペルミスとか<br>秘密鍵の指定場所を間違えてないかチェック</dd>
　<dt>このPCにSSHクライアントがインストールされてない説</dt>
　<dd>そんなことある？はまるとこういうところも一応チェックしがち</dd>
　<dt>プロキシ</dt>
　<dt>ネットワーク不良でgitサーバにアクセスで来てない</dt>
  <dt>全然違う公開鍵をGitサーバに登録している</dt>
</dl>

　…うーん、全部大丈夫そう。。。

# 検証

　プロジェクトのソースコードだけcloneできないのか、
　社内GitLabの適当なリポジトリをcloneしてみた。

<dl>
　<dt>GitLabの任意のプロジェクトを試しにclone</dt>
　<dd>SSH接続：clone<strong>不可</strong>。<br>HTTP接続：<strong>いけた！</strong></dd>
</dl>


# 原因とその発覚経緯

```
$ssh -T -v user.name@host
```

　でログ出しながらgerritサーバとのssh接続確認してた。
　相変わらず`Permission　Denied(PublicKey)`。

　ばーっと出てきたログを見ていると、以下のような記載を発見。
```
debug1: kex: algorithm: ecdh-sha2-nistp256
debug1: kex: host key algorithm: ssh-ed25519
```

ssh-keygenを-tオプションを付けずに鍵生成すると、
デフォルトで暗号化方式はrsa方式が採用される。

私はこの時、楕円曲線暗号方式がセキュリティ最強ということで
意図的に暗号方式をed25519に変更してkey-genしていた。

上記ログより、
- Gitサーバ側はecdh-sha2-nistp256暗号化方式をアルゴリズムとして採用している
- ホスト側（クライアント。つまり自分）はed25519でkey-genしていた
- 公開鍵にはいろいろ種類がある。（RSAとかECDSAとか）それぞれは**暗号化方式**が異なる。
- ふむ、[この記事](https://gigazine.net/news/20200828-ssh-encryption-algorithm/)がわかりやすい。アルゴリズムが合わないと複合できないもんね。

    なんとなくわかってきた。

# 解決策

- ssh-keygenをもう一度やろう！（最強鍵はサーバのアルゴリズム設定とウマが合わなかったらしい…）

    サーバ側の`ecdh-sha2-nistp256`に合わせてkey-genしよう。
    …`ecdh`でkeygenする方法、ググってもなかなか出てこない。。。

    調査していると、ecdhというのは楕円曲線鍵共有方式の一つであるらしい（[Wikipedia参照](https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E3%83%87%E3%82%A3%E3%83%95%E3%82%A3%E3%83%BC%E3%83%BB%E3%83%98%E3%83%AB%E3%83%9E%E3%83%B3%E9%8D%B5%E5%85%B1%E6%9C%89#:~:text=%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E3%83%87%E3%82%A3%E3%83%95%E3%82%A3%E3%83%BC%E3%83%BB%E3%83%98%E3%83%AB%E3%83%9E%E3%83%B3%E9%8D%B5%E5%85%B1%E6%9C%89%20%EF%BC%88%E3%81%A0%E3%81%88%E3%82%93%E3%81%8D%E3%82%87%E3%81%8F%E3%81%9B%E3%82%93%E3%83%87%E3%82%A3%E3%83%95%E3%82%A3%E3%83%BC%E3%83%BB%E3%83%98%E3%83%AB%E3%83%9E%E3%83%B3%E3%81%8B%E3%81%8E%E3%81%8D%E3%82%87%E3%81%86%E3%82%86%E3%81%86%E3%80%81%20%E8%8B%B1%3A%20Elliptic%20curve%20Diffie%E2%80%93Hellman%20key%20exchange%2C,ECDH%20%EF%BC%89%E3%81%AF%E3%80%81%E4%BA%8B%E5%89%8D%E3%81%AE%E7%A7%98%E5%AF%86%E3%81%AE%E5%85%B1%E6%9C%89%E7%84%A1%E3%81%97%E3%81%AB%E3%80%81%20%E7%9B%97%E8%81%B4%20%E3%81%AE%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8B%E9%80%9A%E4%BF%A1%E8%B7%AF%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%80%81%20%E6%9A%97%E5%8F%B7%E9%8D%B5%20%E3%81%AE%E5%85%B1%E6%9C%89%E3%82%92%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%99%E3%82%8B%E3%80%81%20%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7%20%E6%96%B9%E5%BC%8F%E3%81%AE%E6%9A%97%E5%8F%B7%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82)）。
…なら、同じ楕円曲線鍵共有方式のecdsaでkeygenすればできたりしないかな？

```
$ssh-keygen -t ecdsa
```

んで、あとはお馴染みの、ミスりやすいとこに注意して…

- 生成した鍵どっちもに権限つける（忘れがち、、、）
- configファイルに書いてある秘密鍵の名前書き換える（id_ecdsaとかid_ecdsa.pubとかになって生成される）
- サーバに新しく生成した公開鍵を登録する

### よっしゃ、cloneできた！！！


# 余談
使用しているGitサーバの暗号化方式がちょっと古かったみたいです。
さいきょー鍵が一般普及しているものとしんじきっていたことが今回のハマりポイントでした。

参照記事：
https://pan-shoku.com/ed25519-github/
https://www.ibm.com/docs/ja/datapower-gateway/2018.4?topic=commands-kex-alg
https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432
https://qiita.com/ntrv/items/ed0c14f3ea7ee20fe6f9

大変参考になりました…
問題解決には先輩のK氏に助けてもらいました。いつも感謝です