GitHubのSSH設定について（秘密鍵と公開鍵）

## はじめに

プログラミングの勉強をはじめて2ヶ月。
ポートフォリオの作成をはじめることにしました。

そこで避けられないのが、**Git**と**GitHub**。
存在は知りつつも、勉強は後回しになっていました。

正確には、プログラミングの勉強を始めたばかりのときに使っていたテキストに
GitとGitHubの項目があったので、サラッと読んでアカウント登録はしていたのですが、
2ヶ月後の現在、全く記憶がありません(笑)

というわけで、使用前に改めて勉強しようと思いました。

しかし、<font color="red">**SSH接続**</font>が何者なのかを知らなかったことで、
初っ端からつまづきました:sob:

学んだことの備忘録として、記事を書きます。初投稿:tada:



## アクセス権が無いだと！？

練習のフォルダとファイルを用意して、
いざ、記念すべき最初のプッシュ！
意気込んでターミナルに下記コードを打ち込みました。

```
$ git remote add origin git@github.com:ユーザー名/リポジトリ名.git
$ git branch -M main
$ git push -u origin main
```

出力結果はこちら。
```
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

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

<font color="grey">＜翻訳＞
許可が拒否されました (公開鍵)。
致命的: リモート リポジトリから読み取れませんでした。</font>

<font color="grey">正しいアクセス権があることを確認してください
そしてリポジトリが存在します。</font>

あれ？プッシュがちゃんと出来ていれば
〜〜done（完了）やらなんちゃら出力されるはずなんだけどな…

リポジトリは存在しているみたいなので、1・2行目は実行されたようですが、
どうやら3行目のプッシュができなかったようです。
アクセス権が無いっぽいことを言われています:joy:

エラーをググってみたところ、どうやら`SSH接続が切断された`とのこと。

うん。SSHって何？(笑)


## SSHのしくみ（秘密鍵・公開鍵）


そもそもGitHubはアクセスすれば、誰でも簡単にプッシュできると思っていました。
でもよく考えると、大切なコードをGitHubへ預けるのだから、
いろいろとセキュリティが強く無いと困ります。

そこで使用するのが、<font color="red">**SSH**</font> です！

SSHは、Secure Shell（セキュアシェル）の略で、
リモートコンピューターと通信をするための、安全な通信プロトコルの一種です。
ネットワークを経由して使用します。

今回は、私のPC（ローカルリポジトリ）と、GitHub（リモートリポジトリ）を繋ぐのに
このSSHを使用したということです。

そしてこのSSHでは、<font color="red">**秘密鍵**</font>と<font color="red">**公開鍵**</font> という仕組みを利用します:closed_lock_with_key:

よく例えられるのが、
**秘密鍵は自分の家の鍵**で、**公開鍵は鍵穴**だということです。
一軒家を建てる時、鍵をつくり、その鍵で開けられる鍵穴をドアに設置します。
同じように、秘密鍵と公開鍵もセットで作られます。
そして秘密鍵は自分が所有し、鍵穴である公開鍵は、GitHubに設置します。

そうすれば、自分のPCからGitHubへアクセスしたときに
「公開鍵に一致する秘密鍵を持っているね！OKだよ！」
と、ちゃんとGitHubから許可が降りるわけです:cop:

これを踏まえて、SSHの設定手順は、以下になります。

1. .sshフォルダを作成する
2. .sshフォルダの中に秘密鍵と公開鍵を作成する
3. 公開鍵の情報をGitHubへ渡す（＝自分のGitHubアカウントに公開鍵の情報を登録する）

今回の私のエラーは、`SSHの設定ができていない`ことが原因でした。
鍵がないので、アクセスしたところでGitHubからしたら
「お前誰やねん」状態だったんですね:see_no_evil:

というわけで設定していきましょう。

## SSHを設定する

**1. sshディレクトリを作成して、sshフォルダに移動する**
```
$ mkdir ~/.ssh
$ cd ~/.ssh
```
**2.公開鍵と秘密鍵を生成する**
```
※補足1
$ ssh-keygen -t rsa -C メールアドレスを入力
```

```
=>　Generating public/private rsa key pair.
  　Enter file in which to save the key (/Users/user/.ssh/id_rsa):
```
これが出力されたら、そのまま「Enter」を押して大丈夫です。
（ファイル名を任意で指定したい場合は入力します）

```
※補足2
=>　Enter passphrase (empty for no passphrase): :
=>　Enter same passphrase again: :
```
パスワードを２回登録します。
（この時、パスワードは入力せずに「Enter」を押すことも可能です）

```
Your identification has been saved in /Users/User.ssh/id_rsa
Your public key has been saved in /Users/User.ssh/id_rsa.pub
The key fingerprint is:
SHA256:〜〜〜 登録したメールアドレス
The key's randomart image is:
+---[RSA 3072]----+
| o.++.o      o.+o|
|  +o++=o   o. ら　+|
| い .　　　　　　　　　　　　　　　　　...+|
|    B++.o++ .. ..|
|   Eooo SB .     |
|     o 　　　　　　く      |
|      o  .       |
|                 |
|                 |
+----[SHA256]-----+
```
これで、生成完了です。
sshフォルダの中身を確認してみましょう。

```
$ ls
=> id_rsa		id_rsa.pub
```
秘密鍵と、公開鍵（.pub）が生成されたのが確認できました。

**3.公開鍵のSSHKeyをコピーする**
```
Macの場合
$ pbcopy < ~/.ssh/id_rsa.pub

Windowsの場合        	
$ clip < ~/.ssh/id_rsa.pub
```
.sshフォルダに移動している状態で行ってください。
コマンド入力後、特になにも出力されませんが、
超絶長ったらしいkeyがちゃんとコピーされている状態になっています。

**4.公開鍵をGitHubのアカウント情報へ登録する**

GitHubのアカウント→setting→SSH and GPG keys→New SSH key
と移動したら、登録画面になります。
タイトルを入力して（何でも良いと思います）
keyの枠内に、3.でコピーしたkeyを貼り付けます。
Add SSH key を押して、完了です。


※補足1
・`-t rsa`
キーのタイトルにrsaを指定しています。rsaは、RSAアルゴリズムのことです。
このアルゴリズムを使ってキーを生成しています。
・`-C メールアドレス`
-cオプションは、公開鍵に関連付けるコメントを指定するために使用されます。
このコメントは、実際には、誰が鍵を所有しているかという識別情報としてのみ使用されます。
Gitリポジトリにアクセスするためには必要ありません。

※補足2
`Enter passphrase`で要求されるパスワードは、秘密鍵ファイルを保護するために使用されます。
SSHで通信するたびに確認されるものになります。
秘密鍵が誰かに盗まれても、その人がパスワードを知らない限りは、秘密鍵を使用できなくなります。

## さあプッシュしよう！

これで問題なく、プッシュできるようになるはずです。
改めて入力します。

```
$ git push -u origin main
```
出力結果はこちら。
```
The authenticity of host 'github.com (20.27.177.113)' can't be established.
ED25519 key fingerprint is SHA256:〜
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
```

<font color="grey">＜翻訳＞
ホスト の信頼性を確立できません。
キー フィンガープリントは … です。
このキーは他の名前では知られていません
接続を続行してもよろしいですか (はい/いいえ/[フィンガープリント])? </font>

これは、sshを使用したクライアントがサーバーに接続する際に、
そのサーバーが本当に接続したいサーバーかを念の為確認しているのです。

こちらは「yes」と入力しましょう。
（２回目以降のプッシュでは、聞かれません）

```
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 273 bytes | 273.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:ユーザー名/リポジトリ名.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.
```

こんな感じで出れば成功です！
GitHubにもリポジトリがあるか確認しましょう。


## あとがき
はじめてのプッシュ、濃い思い出になりました…
勉強になったので、エラー万々歳です:raised_hands:

転職活動でも「GitHub使える？」ってほぼほぼ聞かれるそうなので、
早めにマスターしたいものです！


#### 参考記事

- [【SSH】初心者必見！SSHキーを作成【秘密鍵と公開鍵](https://god48.com/create-ssh)
- [SSHにおけるフィンガープリントとは。ホスト認証とあわせて解説](https://rurukblog.com/post/ssh-fingerprint/)