🔰【Win/Mac】はじめてのSSH接続🤫GitHubからリポジトリをクローンしてみよう！

HTTPSクローンしかやったことがなかったあなたへ贈るSSHクローン総まとめ🌟
SSH Keysの発行～リポジトリのクローンまで、GitHubを例にやってみよう！

## 前提

- Windows10 または macOS Monterey 12.0.1 想定
- Windowsの場合はスタンダードサイズ・フルサイズなどのキーボード（Insertキーが使えるもの）
- 管理者アカウント
- Gitのユーザ設定が適切に設定されている（本記事の工程をすべて終えた後に設定してもOK）
    - `git config --global user.name`
    - `git config --global user.email`

:::note info
**Package managerを入れよう**
ソフトウェアインストールが楽になるのであらかじめ、Windowsなら[Chocolatey](https://chocolatey.org/install)、macOSなら[Homebrew](https://brew.sh/index_ja)を入れておきましょう！👀

- [Chocolateyのインストール方法](https://qiita.com/heppokofrontend/items/33f53db4e317712af0f8#chocolatey%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) - `choco`コマンドが使えるようになる
- [Homebrewのインストール方法](https://qiita.com/heppokofrontend/items/e92d62b2a94b722d8eb4#homebrew%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B) - `brew`コマンドが使えるようになる

※ これらを利用しない場合でも、任意の方法で必要なソフトウェアをインストールできます
※ それぞれの記事の`choco`や`brew`以外の内容も見ていただけるとうれしいです☺
:::

## 1. 環境を整えよう

後に続く表に沿って、この記事で必要なアプリケーションがインストールされているか確認します。

まずはシェルを開きましょう。

- Windows：PowerShell
- macOS：ターミナル、iTerm2など

表の行ごとに、次のステップを繰り返してください。

1. シェルに「**バージョンの確認方法**」を入力しEnterキーを押す
2. バージョンが返ってくるか確認する<br>確認できない：「**Windows用**」または「**macOS用**」のコマンドを実行して「2」に戻る<br>確認できた： 次のアプリをご確認ください

:::note warn
コマンドは大文字小文字を区別します
:::

|アプリケーション|バージョンの確認方法|Windows用|macOS用|
|:--|:--|:--|:--|
|[Git](https://git-scm.com/downloads)|`git --version`|`choco install git.install -y`|`brew install git`|
|[OpenSSH](https://www.openssh.com/)|`ssh -V`|`choco install openssh -y`|`brew install openssh`|
|[vim](https://www.vim.org/download.php)|`vi --version`（ちょっと長め）|`choco install vim -y`|対応不要[^1]|

[^1]: macOSはデフォルトでvimが使える

:::note
**【Windowsのみ】SSHを有効にする**
**管理者権限**のPowerShellで以下のコマンドを実行してください。

```powershell
Set-Service -Name ssh-agent -StartupType Manual
Start-Service ssh-agent
```
:::

## 2. SSH keysを発行しよう

次のコマンドを1行ずつ、シェルで実行します。

```powershell:Windows向け
cd ~         # ユーザルートディレクトリに移動します（C:/User/アカウント名）
Get-Location # 現在のディレクトリを確認します
ls           # 現在のディレクトリの中身を確認します
```

```powershell:macOS向け
cd ~         # ユーザルートディレクトリに移動します（/User/アカウント名）
pwd          # 現在のディレクトリを確認します
ls -l        # 現在のディレクトリの中身を確認します
```

:::note warn
`ls`コマンドで`.ssh`というフォルダが確認できなかった場合は、`mkdir`コマンドでフォルダを作成します。

```powershell
mkdir .ssh
```
:::

`.ssh/`ディレクトリに移動して、SSH keysを発行しましょう。

```powershell
cd ~/.ssh                                          # ユーザルート/.ssh/ というディレクトリに移動
```

`ssh-keygen`コマンドを使って秘密鍵と公開鍵（SSH keys）を作成します。

```powershell
ssh-keygen -t ed25519 -C "あなたのメールアドレス"    # GitHubに登録しているメールアドレスに置き換えてください
```

:::note
**`ssh-keygen`でなにしてるの？**
秘密鍵と公開鍵を生成しています。
`-t`は暗号化方式を指定するためのオプションで、[`ed25519`](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%89%E3%83%AF%E3%83%BC%E3%82%BA%E6%9B%B2%E7%B7%9A%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0#Ed25519)というのは、つよつよな暗号方式の名前です。
`-C`はこのSSH keysに含めるコメントです。
:::

入力すると、次のようなコメントが返ってきます。

```
Generating public/private ed25519 key pair.
Enter file in which to save the key (***************************************): 
```

「何てファイル名で作る？」と聞かれているので、ここでは「**github_rsa**」と入力しましょう。
そのあとEnterキーを押すと、パスワードを決めてくださいと言われます。

:::note
**GitHub以外のサービス用にSSH keysを発行する場合**
この記事の「github_rsa」をすべて「サービス名_rsa」に置き換えていただくことで、GitHub以外のための鍵を発行できます。
:::

:::note warn
**シェルでパスワードを入力するときの諸注意**
キーを入力しても文字が入力されないように見えていますが、実際には入力することができています。
これは、何文字入力しているのかが他人から覗き見られないようにするためのセキュリティ対策です。
:::

「Enter same passphrase again（確認用に同じパスワードを入力してね）」といわれるので同様に入力します。

```
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

パスワードがうまく入力できると、次のようなログが出力されます。

```
Your identification has been saved in github_rsa.
Your public key has been saved in github_rsa.pub.
The key fingerprint is:
SHA256:****************************************** あなたのメールアドレス
The key's randomart image is:
+--[ED25519 256]--+
|                |
|                |
|                |
|                |
|      :^)       |
|                |
|                |
|                |
|                |
+----[SHA256]-----+
```

次のコマンドを実行して、`github_rsa`および`github_rsa.pub`ファイルが生成されているのを確認します。

```powershell:Windows向け
ls           # 現在のディレクトリの中身を確認します
```

```powershell:macOS向け
ls -l        # 現在のディレクトリの中身を確認します
```

:::note warn
**あとで使うため、まだシェルは閉じないでください。**
:::

:::note alert
**ここでひと段落**
「github_rsa」および「github_rsa.pub」というファイルが`.ssh`ディレクトリに生成されていない場合、何かを間違えています。
できていない場合先に進まないで、最初から手順を確認してください。
:::

:::note alert
**SSH Keysはだれにも教えてはいけません**
ここで生成したファイルを誰かに送ったり、中身を誰かに教えたりしないでください。
:::

## 3. おまじないをしておこう

SSHの設定ファイルに次の内容を追記します。
ちょっとややこしいですが、手順通りやってみましょう。

以下の内容をすべてコピーしておいてください[^2][^3]（ペーストはしない）。

[^2]:[UserKeychainはmacOS向けの記述](https://h2ham.net/macos-sierra-use-keychain/)で、何度もパスワードの入力をしなくてもよくなる方法です。
[^3]:これは[Port 22を使わない方法](https://docs.github.com/ja/authentication/troubleshooting-ssh/using-ssh-over-the-https-port)です。通常はHostNameは「github.com」Portは省略（デフォルトで22）します。

```ssh:.ssh/config
Host *
    IgnoreUnknown AddKeysToAgent,UseKeychain
    AddKeysToAgent yes
    UseKeychain yes

Host github.com
    HostName ssh.github.com
    Port 443
    User git
    IdentityFile ~/.ssh/github_rsa
```

1. `vi ~/.ssh/config`をシェルで実行する（vimエディタで`config`ファイルが開く）
2. 何も書かれていないはずなので、先頭に貼り付ける（何かある場合は先頭に）<br>**Windowsの場合**はShift＋Insertキーを入力する（vimエディタでの貼り付け）
3. `:wq`と入力する（vimエディタでの保存して終了）

:::note warn
**貼り付けを間違えた！修正したいけど文字が消えない！**
i キーを入力して編集モードに切り替えた後に修正してください。
修正が終わった後、ESCキーでノーマルモードに戻れますので、手順3を実施してください。
:::

:::note warn
**`vi`コマンドの後でよくわからなくなった！または最初からやり直したい！**
冷静にESCキーを数回押して、`:q!`と入力した後にEnterキーを押しましょう。
:::

:::note warn
**`vi`コマンド「以外の」シーンでよくわからなくなった！**
冷静にCtrl＋Cキーを押しましょう。
:::

## 4. GitHubくんに公開鍵を渡そう

:::note alert
**なぜGitHubくんに公開鍵を渡すの？**
今回作ったSSH keysのうち、「github_rsa」が**秘密鍵**、「github_rsa.pub」が**公開鍵**と呼ばれています。

公開鍵とは接続先に渡す南京錠で、「たくさんある情報の倉庫」の戸締りに使われます（暗号化用）。
秘密鍵とは、その南京錠を開けられる唯一の鍵です（複合化用）。

「私のデータが改ざんされないように、書き換える権限はこの南京錠でしっかり戸締りしてね！」と、GitHubくんと約束するために公開鍵を渡さなければなりません。
:::

先ほどのシェル内で、次のコマンドを入力して公開鍵（`github_rsa.pub`ファイル）の中身を確認します。
シェルを閉じてしまった人は、`*.pub`ファイルはテキストエディタなどで開いてもOKです。

```powershell
cat github_rsa.pub # Windowsではvimがインストールされていないと使えない。通常は`type github_rsa.pub`
```

すると、次のような文字列が返ってきます。**これが公開鍵です**。

```
ssh-ed25519 ******************************************************************* あなたのメールアドレス
```

これを選択してコピーします。

うまくコピーできない場合は次の方法を実施してみてください。

**Windowsの場合（どちらか）**

- 「右クリック」→「すべて選択」→シェル内のどこでもいいのでクリック→対象個所を選択して「Ctrl＋Cキー」
- テキストエディタで開いてコピーする

**macOSの場合**

```s
pbcopy < github_rsa.pub  # .sshディレクトリにいない場合は pbcopy < ~/.ssh/github.pub
```

**コピーできたら、GitHubくんに公開鍵を渡しに行きましょう！**

1. [GitHub](https://github.com/)にログインする
2. Settingsページから[SSH and GPG keys](https://github.com/settings/keys)ページを開く
3. **New SSH Key**ボタンをクリックする
4. テキストフィールド「**Title**」に任意の文字列を入力する（今お使いのPCの名前、たとえば「何代目MacBook Proくん」とかでもOK）
5. テキストフィールド「**Key**」に**コピーした公開鍵**を貼り付ける
6. **Add SSH key**ボタンをクリックする

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142709/c8f22051-6af7-a6cd-86ca-f0a0ed360aa3.png)

:::note alert
**秘密鍵の流出にご注意！**
公開鍵はいくら流出しても鍵をかける（暗号化する）だけにしか使えません。
また、公開鍵から秘密鍵を特定するのは不可能だといわれています。

一方で、もし秘密鍵を誰かに渡してしまった場合、ペアになっている秘密鍵で暗号化された情報が傍受されたりした際、あなたではない誰かが、あなたのふりをしてあなたの倉庫に入り込んできてしまいます。

万が一流出してしまった場合は、すぐにそのペアの鍵の利用を停止（削除）して、新しい鍵を作り直す必要があります。
:::

## 5. 接続できるか確認してみよう

登録ができたら、無事にSSH接続ができるかどうかを試してみます。

```powershell
ssh-add github_rsa
```

:::note alert
**Error connecting to agent: No such file or directory になっちゃう！**
ssh-agentが無効になっています。
「[SSHを有効にする](#:~:text=%E5%AF%BE%E5%BF%9C%E4%B8%8D%E8%A6%811-,%E3%80%90Windows%E3%81%AE%E3%81%BF%E3%80%91SSH%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B,-%E7%AE%A1%E7%90%86%E8%80%85%E6%A8%A9%E9%99%90%E3%81%AE)」を参照して、コマンドを実行してから再度`ssh-add`してみてください。
:::

すると、次のような文字列が返ってきます。

```
Enter passphrase for github_rsa:
```

SSH keysを生成（`ssh-keygen`）したときに設定したパスワードを入力してください。

パスワードが正しければ、次のようなテキストが表示されます。

```
Identity added: github_rsa (あなたのメールアドレス)
```

ここまでできたら、早速接続テストです。

```shell
ssh -T git@github.com # サービスによって異なります。 e.g. git@bitbucket.org
```

次のように「fingerprint」が正しいか尋ねられます。

```
The authenticity of host 'github.com (XXX.XXX.XXX.XXX)' 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])? 
```

この場合は、GitHubの[SSH and GPG keys](https://github.com/settings/keys)ページを開いて、fingerprintが一致するか確認してください。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142709/da7fc33c-1547-2431-4e60-e30de06fa0c7.png)

:::note
正しくなくても「yes」で接続できることがあるようです（調査中）
:::

正しければ`yes`と入力してEnterキーを押下します。
接続に成功すると、次のようなテキストが表示されます。

```
Hi あなたの名前! You've successfully authenticated, but GitHub does not provide shell access.
```

:::note alert
**あともう一息！**
ここで接続成功のテキストが表示されない場合場合、何かを間違えています。
先に進まずに最初から手順を確認してください。
:::

## 6. クローンしてみよう

お好きなGitクライアントでリポジトリをSSHでクローンしてみよう！

:::note
**普段GUIを使っている！という方へ**
GUIでのSSHクローンは、各種GUIのドキュメントを参照してください。
以上でSSH接続でのクローン準備はおしまいです。おつかれさまでした！
:::

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142709/7dd6e3ab-0f72-0eaf-674e-8d74b3e4c5a7.png)

ローカルリポジトリを置きたいディレクトリにシェルで移動して、GitHubの好きなリポジトリのSSHパスをコピーしてきます。
[heppokofrontend/heppokofrontend](https://github.com/heppokofrontend/heppokofrontend)のリポジトリをSSHクローンしてくる例を見てみましょう。

```powershell:例
cd ~
git clone git@github.com:heppokofrontend/heppokofrontend.git   # 注意：自分のリポジトリでなければ`git push`できない
cd heppokofrontend
ls                                                             # リポジトリの中身が確認できます
```

:::note warn
**URLにご注意**
間違えて「http」で始まるURLでクローンしてしまうと、これまでの工程の意味がなくなってしまいます。
必ずSSHのパスを使ってクローンしましょう。
:::

パスワードを聞かれた場合は、入力してからEnterキーを押すと無事にSSH接続でクローンが始まります。
ローカルリポジトリが落ちてきているはずなので、あとは自由に開発しましょう！

おつかれさまでした！🥳🥒

:::note
**SSH接続を使うサービスはほとんど同じやり方！**
SSH Keysを使うGitHubのようなサービスは、基本的に公開鍵を登録するためのメニューがどこかにあります。
SSH Keysを発行したら、まずは公開鍵をサービスに渡します。
あとは「3. おまじないをしておこう」の章で行った、どのドメインにはどの秘密鍵を使うかの記述を`~/.ssh/config`に追記してあげればSSH接続が利用できます。

```ssh:~/.ssh/config
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_rsa
```
:::