Windows10でGitHubを始める～⑥-3.Git操作時のGitHub認証SSH編

個人学習メモ。

# 1.SSHについて

## 1-1.SSHとは 
 - ネットワーク上のコンピュータを遠隔操作するためのプロトコル
 - パスワード情報含めて通信をすべて暗号化する
 - 「Secure Shell」の略
 - ポート22を使用する

SSHというプロトコルでGitHub～Git間通信を暗号化して安全にファイルをやり取りしましょう、ということ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/af16640a-c0ea-cc5e-dfe3-351d02ae98aa.png)

## 1-2.SSHの認証方式
SSHは「公開鍵認証方式」という方法で通信を暗号化する。
公開鍵認証方式は「公開鍵」「秘密鍵」の2種類の鍵を使って安全に情報をやり取りする方式のこと。
（この2種類の鍵をキーペアと言ったりする）
以下の流れでクライアントとサーバがやり取りをし、認証を行う。

1. クライアントが公開鍵と秘密鍵を作成する
1. クライアントが公開鍵をサーバに渡す
1. クライアントがサーバに認証を要求する
1. サーバは公開鍵で暗号文を作成し、クライアントに送る
1. クライアントは秘密鍵で暗号文を復号し、その結果をサーバに送る
1. サーバはクライアントから送られた復号結果を確認する
1. 復号結果が正しければ、正規のユーザーとして認証される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/40be876f-21e3-3a2f-b6e7-e083c50310bc.png)

# 2.SSH公開鍵・秘密鍵生成

Git Bashで`ssh-keygen`コマンドを実行する。対話形式で公開鍵・秘密鍵（キーペア）が生成される。
※`ssh-keygen`コマンドの各種オプションについて触れないので各自調べてほしい。
デフォルトで作成されるキーペアはrsa。 

```
ssh-keygen
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3e16be6a-2e76-560d-6552-3c02905b1ad0.png)
`Enter file in which to save the key (/e/home/.ssh/id_rsa):`で鍵を格納するディレクトリを聞かれている。そのままEnterすると`.ssh/`が作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/f9ccf154-dda0-c4f1-2833-4e6d656afbf3.png)
`Enter passphrase (empty for no passphrase):`でパスフレーズを入力せよと言われる。パスフレーズは自分でパスワードを考えて入力する。後でこのパスフレーズは使うので忘れないようにする。
パスフレーズは二回入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/5428581a-4010-7a04-c3a2-5b990a06dbcd.png)
`~/.ssh`ディレクトリにキーペアが生成された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/db998424-23cf-c4fc-196d-5dae79a6625e.png)
`~/.ssh`ディレクトリ内にキーペア`id_rsa`と`is_rsa.pub`が存在することが確認できる。
`.pub`がついている方が公開鍵（public key）である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/7af62149-1b8b-133b-0125-d883c17bd351.png)

Windowsのエクスプローラーからも確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/647451e0-87f3-5b41-069f-f111d3f2fe69.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/7a355e1a-8f1a-73e7-9871-3d614566b90c.png)

ここは好みだが私はリネームしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/d5d4b5f3-e7e9-0f1b-f4f3-c36c27977335.png)

# 3.GitHubに公開鍵を登録する

公開鍵の中の文字列をコピーしてGitHubに登録する。
`cat id_rsa_qiitatest.pub`で中身を見るとこんな感じの文字列が書かれている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/99d196c3-d7a9-6f01-ca8b-d51a37614698.png)
これをコピーしてもいいが、以下コマンドでクリップボードにコピーできる。

```
clip < id_rsa_qiitatest.pub
```

ブラウザでGitHubにログインする。
[Settings]-[SSH and GPG keys]
SSH keysの[New SSH key]をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/76902d82-21cc-f674-0603-31b18ca1cb6b.png)

Titleに適当な名前を付けKeyに公開鍵を貼り付けて[Add SSH key]をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/27f48e7f-5459-1fec-85c9-2995ed3416ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/e90304c3-25b0-ce01-bc4e-6e1b4fb164c6.png)

# 4.ローカルGit側の秘密鍵設定ファイル作成
ここから自分のPC側Gitの設定を行う。
## 4-1.configファイルの作成
Git Bashで.ssh直下にconfigファイルを作る。

```
touch config
#config作成
chmod 600 config
#権限設定
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/65f36aad-ae49-3de7-04df-9533a9d8733d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/bc4fd576-6fe1-0201-11fd-615da72f60fd.png)

configファイルを編集する。今回はvimで編集する。
```
vim config
```

ファイルを開いた後、`i`で編集モードに入り以下情報を追加する。

```
# Githubの設定
### Qiitaテスト用
# - - - - - - - - - - - - 
Host github.com
  User git
  Port 22
  Hostname github.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_rsa_qiitatest #秘密鍵のパスを入力
  TCPKeepAlive yes #ここは好み
  IdentitiesOnly yes #ここは好み
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/ec90d597-eb17-6873-4923-5235264ce63c.png)

ファイルへの追記が終わったら`esc`で編集モードを抜け、`:wq`Enterで保存して終了する。

## 4-2.SSH Agentの設定
パスフレーズの入力をいちいちしなくてもいいように、SSH Agentの設定をする。
Git Bashでssh-agentを起動する。

```
ssh-agent bash
```
ssh-agentに生成した秘密鍵を登録する。
パスフレーズが求められるので、SSHキーペア生成時に入力したパスフレーズを入力する。

```
ssh-add ~/.ssh/id_rsa_qiitatest
```

以下コマンドで登録できたか確認する。

```
ssh-add -l
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/372ba90e-b07d-fba0-3ed2-dc3d71aa6d12.png)

鍵の情報が表示されていればOK。

# 5.GitHubにSSH接続できるか確認する

以下コマンドを実行する。

```
ssh -T git@github.com
```
`Hi emi-ki! You've successfully authenticated, but GitHub does not provide shell access.`とメッセージが表示されればOK。SSH接続できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/35a9ccf0-cddd-addc-733c-73a5654ed3db.png)

初回接続時は以下のようなメッセージが出る場合があるが、`yes`ですすめる。

```
The authenticity of host 'github.com (13.114.40.48)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
```
これでSSH認証が通っているので、リモートリポジトリとファイルのやり取りができる。
ディレクトリ内の不要なテキストファイルを削除したり追加したりしてadd、コミットし、pushすると無事リモートリポジトリ（GitHub）と通信できていることが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/e35146e5-7279-93ff-cded-7badb3cf48b8.png)



# 余談
キーペアはTeraTermのGUIで作る方法もある。これが一番簡単かもしれない。

https://qiita.com/kumaGoro_95/items/d5a4ad035c1de68a59e3

だがしかしエンジニアたるものコマンドで実施したいのが心情。

# 参考
[Windows10でGitHubを始める～⓪Gitの概念とインストールソフトの種類](https://qiita.com/emiki/items/5c8e52cf6b8506015462)
[Windows10でGitHubを始める～①Gitインストール](https://qiita.com/emiki/items/c0aa0b4da4b63921b153)
[Windows10でGitHubを始める～①'おまけGitホームディレクトリ変更](https://qiita.com/emiki/items/d3f7c054b70171218f64)
[Windows10でGitHubを始める～②GitHubアカウント作成](https://qiita.com/emiki/items/dadf77e9ae1e2b192323)
[Windows10でGitHubを始める～③GitHubでのメールアドレス設定とGitクライアントでのユーザ名・メールアドレス設定](https://qiita.com/emiki/items/4103150a5d7a7cfbff24)
[Windows10でGitHubを始める～③'おまけユーザ名・メールアドレス設定について詳細](https://qiita.com/emiki/items/24212696b54fd16e8af8)
[Windows10でGitHubを始める～④リモートリポジトリの作成（GitHub）](https://qiita.com/emiki/items/5080d948af4a2d0febf5)
[Windows10でGitHubを始める～⑤Githubにプッシュする](https://qiita.com/emiki/items/a2871ab626396e95d9ec)
[Windows10でGitHubを始める～⑥-0.Git～GitHub間の認証について](https://qiita.com/emiki/items/eeaf77d51aadef98aea9)
[Windows10でGitHubを始める～⑥-1.Git操作時のGitHub認証HTTPS（Git Credential Manager）](https://qiita.com/emiki/items/3f2ebda7280374fb3bb7)
[Windows10でGitHubを始める～⑥-2.Git操作時のGitHub認証HTTPS（Personal access token）](https://qiita.com/emiki/items/498b05ede19eee3ad916)
[Windows10でGitHubを始める～⑥-3.Git操作時のGitHub認証SSH編](https://qiita.com/emiki/items/1f1fc0bf0c2c4347148d)
[Windows10でGitHubを始める～⑦GitHubへのPullRequest](https://qiita.com/emiki/items/8619441dca761869177f)

https://it-trend.jp/encryption/article/64-0057

https://qiita.com/coffee_g9/items/e1b9ab28cfa54f854308

https://qiita.com/uchi_y/items/5c8d26a3848e670b0a60

https://hana-shin.hatenablog.com/entry/2021/12/21/202454#1-ssh-keygen%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%81%AF

https://qiita.com/blueray777/items/78eb5983997e4c94e590