GithubでSSHをするメリットと使い方

# GitHubにおけるHTTPS接続とSSH接続の使い分け
GitHubのリモートリポジトリにアクセスするには**HTTPS接続**と**SSH接続**がある。この2つの特徴をまとめると以下のようになる。

| 項目 | HTTPS接続 |SSH接続|
|:-:|:--|:--|
|通信速度|SSHより若干遅い|HTTPSよりも若干速い|
|安定性|SSHより若干不安定|HTTPSよりも若干安定（特に大規模リポジトリの操作）|
|メリット|<ul><li>Gitがあればすぐに使える</li><li>会社のネットワークやファイアウォールで制限されにくい</li></ul>|<ul><li>一度設定すればパスワード入力不要で操作ができる</li><li>より安全な認証（公開鍵認証）</li><li>2要素認証を回避して使える</li></ul>|
|デメリット|<ul><li>2要素認証を使う場合はGitHubのPersonal Access Tokenが必要</li><li>大規模リポジトリのクローンやプッシュで不安定になることがある</li></ul>|<ul><li>SSHキーの生成・登録が必要</li><li>一部の企業ネットワークではSSHがブロックされることがある</li></ul>|
|使いどころ|<ul><li>環境構築が簡単で済む場合（初心者向け）</li><li> SSHが制限されている環境（会社のネットワークなど）</li></ul>|<ul><li>頻繁にリポジトリを操作する場合（認証不要で快適）</li><li>より安全な認証が求められる場合</li></ul>|

## 結論
- 簡単に使いたい or 企業のネットワークで使うならHTTPS
- 頻繁に使う or セキュリティを重視するならSSH


# WindowsでSSHキーを発行する時の留意点
- SSHキーを発行する際は**Git Bash**を使うのが便利。（GitBashはGitをインストールすると一緒にインストールされる）
- 発行されたSSHキーはデフォルトで「C:\Users\ユーザ名\.ssh」フォルダに配置される

# SSHキーの発行

```bash:Git Bash
# ダブルクオテーションなくても良い。
# 入力する文字列の中で半角スペースがある際にダブルクオテーションで囲めば半角スペースも認識してくれる。
# ダブルクオテーション入力を常習化しておいた方が良い
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# Generating public/private rsa key pair.

# sshキーの作成場所を指定。デフォルトで良いならそのままEnter
# 変更例①：D:/key/id_rsa
# 変更例②：D:/key/sample　（sampleという名前の鍵ができる）
Enter file in which to save the key (/c/Users/ユーザ名/.ssh/id_rsa):

# パスフレーズ（SSHキーのパスワード）を指定。
# SSHキーが漏洩してもパスフレーズあれば安心。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

# Your identification has been saved in /c/Users/ユーザ名/.ssh/id_rsa
# Your public key has been saved in /c/Users/ユーザ名/.ssh/id_rsa.pub
# The key fingerprint is:
# SHA256:ーーー your_email@example.com
# The key's randomart image is:
# +---[RSA 4096]----+
# |      .          |
# |     . o         |
# |  .   = o        |
# |   o + +    .    |
# |. o o + S  . o   |
# |.+ = * o  . . o  |
# |+ + E =..  o o . |
# | =.+ o o+ ..o o  |
# |..+.o==o+=o.+=   |
# +----[SHA256]-----+
```

## SSHキーをSSHエージェントに追加

#### SSHエージェント
SSHキーの管理と認証を簡単にするためのプログラム。
SSHエージェントは、SSHキーをメモリに保持し、SSH接続を行う際に自動的にキーを提供することで、パスフレーズの再入力を省略できる。

#### SSHエージェントの機能
- **SSHキーの管理**：複数のSSHキーをメモリに保持し、適切なキーを簡単に使える
- **パスフレーズのキャッシュ**：パスフレーズを設定している場合、最初にSSHキー追加の時にパスフレーズを入力する。それ以降、SSHエージェントがキーとパスフレーズをキャッシュするため、再度パスフレーズを入力する必要がなくなる
- **自動認証**：SSH接続する際にSSHキーを自動で設定する


```bash:Git Bash
# SSHエージェントの起動
eval "$(ssh-agent -s)"

# SSHキーをSSHエージェントに追加
ssh-add ~/.ssh/id_rsa
```

## 公開キーをコピー
```bash:Git Bash
# 公開キーを表示する
cat ~/.ssh/id_rsa.pub

# 表示されたid_rsa.pubの中身の内メールアドレス以外をコピーする
# 例えば公開鍵の内容が次のような場合、コピー対象は「ssh-rsa AAACSfNxxxxxxxxxxxxxxxx==」
# (メールアドレス直前の半角スペースはコピー不要）
# ssh-rsa AAACSfNxxxxxxxxxxxxxxxx== your_email@example.com

```

## 公開キーをGithubに登録する

##### 1.GitHubの右上にあるプロフィールアイコンをクリックし、「Settings」を選択

##### 2.左側のメニューから「SSH and GPG keys」を選択

##### 3.「New SSH key」ボタンをクリックする。
##### 4.「Title」にキーの名前を入力し、「Key」に先ほどコピーした公開キーの内容を貼り付ける。
##### 5.「Add SSH key」ボタンをクリックしてキーを追加する。


## SSH接続テスト
```bash:Git Bash
# SSHエージェントが正しく設定されているか確認するために、GitHubへの接続をテスト
ssh -T git@github.com

# 正常に接続できると以下メッセージが表示される。
# Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell access.
```

## SSHでクローン

##### 1.GitHubのリポジトリページの「Code」ボタンをクリックし、SSHのURLをコピー

##### 2. Git Bash上で以下コマンドを実行。
```bash:Git Bash
# 前提：クローンしたいフォルダに移動した状態で実行
git clone git@github.com:your-organization/internal-repo.git
```

## SSHでpush
ssh接続でpushする場合は、事前にgit remote set-urlコマンドを使い、pushする先のリモートリポジトリURLをSSH用のURLに変更する必要がある。
今回の場合、リモートリポジトリURLを`https://github.com/xxx/sample.git(https接続)`から`git@github.com:xxx/sample.git(SSH接続)`に変更する
```bash:Git Bash
# 現在のリモートリポジトリURLを確認する
# origin  https://github.com/xxx/sample.git (fetch)
# origin  https://github.com/xxx/sample.git (push)
git retemo -v

# originのリモートURLをssh用のURLに変更する
git remote set-url origin git@github.com:xxx/sample.git


# 再度、現在のリモートリポジトリURLを確認する
# 以下のようにSSH用のURLになっていればSSHでpushする準備はOK
# origin  git@github.com:xxx/sample.git (fetch)
# origin  git@github.com:xxx/sample.git (push)
git retemo -v
```


# 発生したエラーと対応方法
## Permission denied （権限がない）
```bash:エラー内容
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
```

### 原因
Githubに公開鍵の内容登録をしていない。もしくは、GitHubに登録したSSH公開鍵の内容が間違っている場合に発生する。
一度登録した公開鍵は編集ができないので、新しく公開鍵を登録すれば良い


## ERROR: Repository not found.（リポジトリが見つからない）
```bash:エラー内容
ERROR: Repository not found.
fatal: Could not read from remote repository.

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

### 原因