GithubでSSHで通信する時にパスワードを聞かれてしまう時の対処法[Git]


下のようにsshでgitをクローンしようとしたら
```zsh:git
git clone git@github.com:....git
Cloning into '...'...
Enter passphrase for key
```

とパスワードを毎回求められてしまって困っていました。

あれ設定してたのにおかしいなと思いつつ、sshもしかしてあまりわかってない？と思ったので、sshについてちゃんと調べてみようと思います。

# sshとは
`Secure Shell`の略称で、物理的に遠い場所にあるリモートコンピュータに接続するための通信プロトコルです。

コンピュータを遠隔で操作するにあたって遠隔操作するための通信を暗号化することによって、外部からの攻撃を防ぎながら通信することができます。


## 認証方式
SSHには、パスワード認証方式と公開鍵暗号方式の2つあります。

### パスワード認証方式
パスワード認証方式は、webサイトのログインでよくあるIDとパスワードを入力して認証する方式のことです。

クライアントがユーザ情報(ID)とパスワードを送信して、サーバー(接続先のコンピュータ等)がそのユーザ情報とパスワードの組み合わせに合致するデータがあるかを調べ、合致したら認証するという仕組みです。

この認証方式は手軽ではありますが、問題としてパスワードが流出すると不正アクセスできてしまうことやユーザーとパスワードの組み合わせを総当たりで入力する攻撃(ブルートフォールス攻撃)によって、認証が突破されやすいというデメリットがあります。

### 公開鍵暗号方式
公開鍵暗号方式は、紐づけられた公開鍵秘密鍵を生成して認証する仕組みです。
公開鍵と秘密鍵はクライアントが作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/8532cf49-8d65-2a6f-9f22-82a5f4cdfccc.png)


秘密鍵はクライアントに、公開鍵をサーバーに渡して、認証していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/0d20bbb3-2be2-c8a6-3378-22d217334034.png)


まず、クライアントがサーバーにリクエストします。

そしてサーバーはレスポンスとして公開鍵で生成した乱数から暗号化した電子署名を送ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/640c76b7-ff97-58ac-7063-1d14b4702e2a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/a2201dec-54bf-7d83-3fa7-d70c0bee67a1.png)



それをクライアントは秘密鍵で復元します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/cb281f5d-cdb9-6745-244e-4a71170f4b5b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/1cc631b5-94ed-0c61-b81f-105875a30111.png)


復元して解読した署名をサーバーが受け取ると認証するという仕組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/b809916c-1d3e-3d50-958d-74c9fff853ea.png)



# 鍵を生成する

ssh-keygenコマンドを使って公開鍵、秘密鍵を生成します
-tオプションで暗号方式を決定し、-Cでコメントにメールアドレスを記述します。

```zsh:zsh
ssh-keygen -t ed25519 -C <mail_address>
```

:::note
### ed25519とは

エドワーズ曲線デジタル署名の実装の一つで、楕円曲線の一つであるエドワード曲線を使ったものです。

従来のRSA方式に比べて、暗号強度が高いと近年採用されることの多い署名方式です。

:::

パスフレーズを求められると下のような表示が出てきます。
これは`randomart image`という人間が視覚的に生成された鍵が違うものだと認識できるように作られたフィンガープリントのことです。

```
+--[ED25519 256]--+
| . o=o.     o++  |
| .o+o+ . . ..o==.|
|  o.B . . . .o.Oo|
|   X * =    o E.=|
|  + X * S  . o  .|
|   o + +         |
|    . o          |
|                 |
|                 |
+----[SHA256]-----+
```


生成ができたら、`.ssh/config`に下のような記述をします。

```~/.ssh/config
Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519
```

秘密鍵をssh-addで登録します。
--apple-use-keychainでmacのキーチェーンに保存しています。
こうすることでsshの際にパスフレーズを聞かれなくなります。

```
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
```

これで公開鍵をコピーします。
```zsh:zsh
pbcopy < ~/.ssh/id_ed25519.pub
```

ここでsshを登録します。

https://github.com/settings/ssh/new

下のTitleの任意の名前にします。
Keyに先ほどコピーした公開鍵を貼り付けます。
![スクリーンショット 2024-11-22 10.17.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766230/48bb13c1-3b75-53ea-3969-9e1b5567392d.png)

`Add SSH key`を押した後に下のコマンドで接続できるかを確認します。

```zsh:zsh
ssh -T git@github.com
```

下のように出てきたら完了です！

```zsh:zsh
Hi <user_name>! You've successfully authenticated, but GitHub does not provide shell access.
```

# git関連の記事

https://qiita.com/maooz4426/items/b547f8474e3a83f96336

https://qiita.com/maooz4426/items/0f994e08f17dfaa1b3ba

https://qiita.com/maooz4426/items/8ae2a7df1add39e9f943

https://qiita.com/maooz4426/items/a4cc324092f1e3c03c19

https://qiita.com/maooz4426/items/ae28f88323f6eb6ef954