<完全解説>GitHubリポジトリにSSH接続してクローン、プッシュできるまで(Mac)

#GitHubにSSH接続できるまでの大まかな流れ

公開鍵、秘密鍵をterminalで生成
→公開鍵をGitHubの[Key設定](https://github.com/settings/keys)に登録
→ローカルにある秘密鍵をつかって、GitHubにSSH接続

という流れです。


#GitHubとは
まずGitHubって知ってるし、知ってるから検索して記事見てるんだわwって感じですが、
一応、一方的にかつ形式的に説明

[GitHub](https://github.com/)とは、`ソースコードやデザインデータを保存・公開できる管理サービスのひとつ`

便利ですねぇ〜
似てるサービスには、[GitLab](https://www.gitlab.jp/)ってありますね

#SSHとは
SSHとは、`Secure Shell`の略で、SSH接続とは、安全にリモートコンピューターを遠隔操作をする枠組みの一種。
`パスワード認証方式`と`公開鍵認証方式`の2つが代表的で、SSHの設定方法により選択が可能

| 項目 | パスワード認証方式 | 公開鍵認証方式 |
|:-:|:-:|:-:|
| 方法  | パスワード | 公開鍵|
| 安全レベル | 低め | 高め |
| 設定の難しさ | 簡単 |  複雑|
| 推奨度 | △ | ◎ |


今回は、公開鍵認証方式でいきますかっ



#1. ターミナルで秘密鍵・公開鍵の生成コマンドを実行
※`$`はターミナルで見る一番右端のやつですね。

```shell
$cd ~/.ssh
$ssh-keygen -t rsa
```
####<解説>
実は隠しフォルダとして、
MacのFinderのHOME(`/Users/username/`)のディレクトリには、`.ssh`というフォルダが存在していて、
実際に、GUIのホームディレクトリ上で確認したい場合は、
`command(コマンド) + shift(シフト) + .(ドット)`
のショートカットキーを押すと、出現する。 
（いやいや、わざわざ隠しているなら、自分から見つければいい、、、）


つまり、terminal上でその`.ssh`フォルダに移動し、そこで、
`ssh-keygen -t rsa`
というコマンドを打ったということになる。

`keygen`は`key generate`の意味を指し、鍵生成コマンド。
`-t`はオプションで、 生成する鍵の種類を指定できる。（[参考URL](https://nxmnpg.lemoda.net/ja/1/ssh-keygen)）
`rsa`というのは、鍵の種類で、rsaという暗号アルゴリズムを用いて作った鍵だよってこと


#2. 鍵が生成される
`ssh-keygen -t rsa`コマンドを打つと、

```shell
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
のように表示され、`Enter`を推し進めると、生成される。

####<解説>
デフォルトの鍵の名前は、`id_rsa`となっていて、
もし生成時に名前をつけたい場合は、`Enter file~`の箇所で、適当な名前をつける。
(今回は、`id_github_rsa`という名前で進めちゃいます)

```shell
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):id_github_rsa←ここで名前を指定する
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
#####注意事項
デフォルトの鍵名`id_rsa`で作った時に、初回は問題ないが、
次回鍵を作る時に、また同じデフォルト名`id_rsa`で作成してしまうと、
**鍵自体が更新されてしまい、問題となるので、名前をつけることをオススメ**します。

また、鍵名と同様に、`passphrase`を設定したい場合は、適当に設定。
合言葉みたいなもので、設定すると、`passphrase`を入力しないと、公開鍵が出力できなくなります。

####ちなみに、rsaファイルの権限を読取に変更すると良き◎
所有者には、読取権限だけを付与して、
ファイル自体に制限をかけておくと、セキュリティレベルが上がるのでオススメ

```
$ chmod 400 ~/.ssh/id_github_rsa　※400は 所有者は読み取りOK, グループ, その他は禁止
$ chmod 400 ~/.ssh/id_github_rsa.pub
```
3桁の番号があるが、左から、所有者の権限、グループの権限、その他の権限という設定になる。
上記コマンドは、認証鍵に、**所有者だけ読込権限を付与**ということになる。


#3. `~/.ssh/config`ファイルに、鍵の用途を記述する
鍵を作る時に名前を指定した時は、configファイルに記述します。
※デフォルトでは`id_rsa`という名前の鍵を読みにいくので、もしconfigファイルに名付けた鍵の設定をしないと、SSH接続に失敗してしまう。

```
$vi ~/.ssh/config
```
を打って、configファイルの中身をみます。

```
i
```
を押して、`vim`を`insert mode`に切り替えます。
(insertの頭文字の`i`ですねえ)

```shell
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_github_rsa
  User git
```
そして、上記をコピペ。
次に、下記の上書き保存のコマンドを打って、`Enter`を押す

```
:wq
```
これで、変更点を保存して、`vim`から抜けられます。
※`vim`とは、いわゆるterminal上でファイル内容を編集する時に使うモード　みたいなものです。

※参考までに

| コマンド | 挙動 |
|:-:|:-:|
| :q | 無編集の状態でvimを閉じる。  |
| :q! | 変更内容を破棄して終了 |

####<解説>
- `Host github github.com`の`github`はailias(エイリアス)、つまり、あだ名です。
 - SSH接続する時に、あだ名を使って接続できるようになります。
- `HostName`は、どのホストに接続するか指定します。今回は`github.com`ですねえ
- `IdentityFile`は、秘密鍵のファイルを絶対パスで指定します。
- `User`はユーザー名を指定します。


#4. 生成した公開鍵をGitHubのSSHキー設定に登録
[GitHub Key設定ページ](https://github.com/settings/keys)にアクセスして、`New SSH key`をクリック。
![スクリーンショット 2021-02-03 17.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075243/b4aeaa7e-a621-1a9b-7811-8c230013eca2.png)


すると、次のページに遷移するので、
タイトルに使っている「鍵の名前+`.pub`」と入れて、
![スクリーンショット 2021-02-03 17.50.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075243/2d2e6d6c-f04f-b8c5-4847-4268741839f4.png)

Keyには、`id_github_rsa.pub`の内容をコピペする。
下記、コマンドを使えば公開鍵の内容をコピーできます。

```
$pbcopy < ~/.ssh/id_github_rsa.pub
```

#####注意事項
**決して、`.pub`じゃない方の内容をコピペしないこと。
それは秘密鍵なので、なんでも不正利用されてしまいます。
秘密鍵から公開鍵は生成できてしまうので、、、きをつけましょう！！！！！！！**

#5. いざ、接続！！頼むよ〜
```
$ssh -T git@github.com
```
えいっ

```
Hi GitHunUserName! You've successfully authenticated,
but GitHub does not provide shell access.
```
と表示されれば、完了です。
GitClientから接続できます。クローン、プルも自由自在です。
個人的なオススメ： [GitFork](https://git-fork.com/)

####<解説>
- `ssh`は、ssh接続します　のコマンド
- `-T`は、オプションで、**仮想端末の割り当てを禁止します。**という意味で、今回は、中間的な踏み台の仮想環境を通して、`github.com`にはアクセスしないから、仮想端末を割り当てる必要がないということで、このオプションをつけている
- `git@github.com`は、`config`に設定した、`User`と`HostName`を、次の形`User@HostName`でくっつけたもの。


```
$ssh -T github
```
でも接続できます！



#まとめ
###やったぁぁぁぁぁぁぁぁぁぁぁぁあああああああああああああ！！！！