何度、SSH keysを設定してもPermission denied (publickey)される問題

#SSHでPermission Deniedが発生する
```
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```
いつものようにgit pushすると問題が発生した。
まず、考えられたのは最近、Macを買い換えたためgitの設定に問題があること。
何度もSSHキーの再設定を行ない一時的に解決できたが、また出来なくなった。
そこで解決方法をまとめる。

MacBook Pro 2018 macOS Mojave, 32GB
ターミナルは、iTermを使用している

1. SSHキーの認証状態
2. gitconfigの確認
3. ~/.ssh/configの確認
4. ssh -T git@github.com は通るか
5. known_hostsの確認


#１．SSHキーの認証状態
https://help.github.com/articles/error-permission-denied-publickey/
GitHub公式の『Error: Permission denied (publickey)』トラブルシューティングに沿って行う
<img width="234" alt="スクリーンショット 2018-09-29 23.59.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/4a920efc-2d91-74df-aa62-b9e957c14b6d.png">

ssh-agentを通して実際が使われているのか確かめると
The agent has no identifies.となる。実は、これ前に一時的に解決できたときも同じようになった。
再起動するたびにThe agent has no identifies.となるのは腹が立つ。

>sshの秘密鍵登録を
ssh-add ~/.ssh/id_rsa
にしているはずなのに、毎回再起動するたびに
ssh add -lすると 
The agent has no identities.
になってしまい、毎回鍵登録しないといけないのかと悩んでいました。
ssh-add -K ~/.ssh/id_rsa 　　 を入力。
一応これでgithubのpushもssh認証されて問題なく突破。やったね。
と思いきや...
再起動して ssh add -l すると
The agent has no identities.
他のサイトで確認したとところ
~/.ssh/configに
UseKeychain yes
AddKeysToAgent yes
でイケる

引用元
http://tktechblog.hatenadiary.jp/entry/2017/10/09/105702

とのことです。これやったけど、
まだ接続できねええええええ＼(^o^)／

#２．gitconfigの確認
<img width="393" alt="スクリーンショット 2018-09-29 22.07.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/944a6878-f803-e88a-79bc-196bd8885c3e.png">

| キーワード | 内容 |
|:--|:--|
| Host | ホスト名 |
| HostName | ホストのアドレスかIPアドレス |
| User | ログインユーザ名 |
| IdentityFile | ログインするための秘密鍵のパス |
| Port | ポート番号(デフォルトは22) |
| TCPKeepAlive | 接続状態を継続したい場合：yes　継続しない場合：no |
| IdentitiesOnly | IdentityFileが必要な場合：yes　必要ない場合：no |
| ServerAliveInterval | 一定期間サーバからデータが送られてこないときに、タイムアウトする秒数。(例) 120 |

gitignore_globalとは，Gitで管理する全てのフォルダに適用されるgitignoreのようなファイルです

#３．~/.ssh/configの確認
<img width="203" alt="スクリーンショット 2018-09-29 22.08.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/006c9f85-f958-5477-cda5-23479f347573.png">

#4. ssh -T git@github.comは通る
<img width="647" alt="スクリーンショット 2018-09-29 23.18.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/684968d8-1f72-64f3-83d1-34ae623cb065.png">

| SSH オプション | 内容 |
|:--|:--|
| -i | 秘密鍵を指定 |
| -p | ポート番号を指定 |
| -l | ログインユーザー名を指定 |

#5. known_hostsの確認
サーバーにSSH接続すると.ssh/known_hostsファイルにサーバーのホストキーが追加されます。新しいサーバーに接続する時は確認されるし、ホストキーがknown_hostsに記載のものと変わっていると接続できません。
このホストキーのチェックは、sshのオプションで無効にできます。

```
ssh -o StrictHostKeyChecking=no server-name
```
これでknown_hostsを気にせずにアクセスできます。バッチ処理のシェルスクリプト等でパスフレーズ無し秘密鍵を使用しているような時、役立つことがあるかもしれません。



#ここでfingerprintが異なることに気づく
<img width="617" alt="スクリーンショット 2018-09-30 14.24.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/91134eb2-105b-f8e4-c6f8-aaae75d34361.png">
こちらが ＃１を考慮してもう一度ssh-agentにキーを登録して確認した際のfinger print
<img width="712" alt="スクリーンショット 2018-09-30 14.29.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/41ee1ec3-a1a2-fe55-445c-202b5411109b.png">
そして、こちらが実際にgit pushした時の挙動
known_hostsを削除してから接続するため確認が出るが、finger printが異なっている

## RSA fingerprintとは
fingerprintとは
鍵を識別するための情報。いわゆる電子指紋。
https://qiita.com/hotpepsi/items/128f3a660cee8b5467c6
こちらの記事が詳細に解説している

# もう分からないから、またSSH新規発行＆登録するw
<img width="639" alt="スクリーンショット 2018-09-30 20.39.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/a5f297ca-79c2-ed48-c1d5-8a06a55c7752.png">

ssh -T git@github.comで見られるRSA key fingerprintと秘密鍵を作った際のfingerprintは、今回も異なった。これは嫌な予感。ここでgit pushすると、予感は的中。またもやpermission deniedされた。


負けじと食らいつくと気になる点を見つけた。
Changing a remote's URL
https://help.github.com/articles/changing-a-remote-s-url/

<img width="514" alt="スクリーンショット 2018-09-30 21.17.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/b50b4b78-c810-cdc1-71dd-06ea7a1c9ffe.png">

>If you're updating to use HTTPS, your URL might look like:

```
https://github.com/USERNAME/REPOSITORY.git
```
>If you're updating to use SSH, your URL might look like:

```
git@github.com:USERNAME/REPOSITORY.git
```
この、どちらかになるはずだが僕の場合、github.comからリンクが始まっている。



<img width="393" alt="スクリーンショット 2018-09-29 22.07.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/118756/944a6878-f803-e88a-79bc-196bd8885c3e.png">

ということでgitconfigを見ると
https://github.com/とgit@github.com:がgithub.com:になるよう設定されてしまっている。
何で、こんな見落とし気付かなかったんだ！！！！！！


以前のPC、数年前にgit周りを設定しており方法を忘れていた。
またSSH周りの知識が不十分であったため自分でも何をしているのか
設定チュートリアルをやる中で分かっていなかった。

P.S.
普段、コーディングする時にググって実装したら終わっており
新しく学んだ実装法や知識が抜け落ちていくのでこれからQiitaに覚書をしていきたい。

[SSHに関してよくまとめられた記事](https://qiita.com/kenju/items/b09199c4b3e7203a2867)

eval（イーバル）はいくつかのプログラミング言語が持つ、文字列を式として評価する関数、または複数の文をプログラム中のあるコンテキストで実行するサブルーチン