GitHubにSSH接続するまで

# 流れ
* SSH鍵生成
* GitHubにSSHを登録
* Git設定
* SSH接続
* git firstcommitまで

## SSHとは
SSHとは、Secure Shell（セキュアシェル）の略称で、リモートコンピュータと通信するためのプロトコルです。認証部分を含めネットワーク上の通信がすべて暗号化されるため安全に通信することができます。
つまり、安全安心にサーバにログインするための仕組みです。

今回は、SSH接続に公開鍵認証方式を使用します。

:::note info
公開鍵認証とは
SSHでのユーザー認証に公開鍵認証を使用すると、原理上は秘密鍵を持っているクライアントしかログインできなくなるためセキュリティを高めることができます。
:::

### SSH鍵の生成

ssh-keygenしましょう。
今回は、2022年時点で暗号化方式で最強と言われているEd25519（エドワーズ曲線デジタル署名アルゴリズム）を使って生成します。

``` terminal:ssh-keygen
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519
```
:::note info
ssh-keygenコマンドのオプション
　-t [type]              : 生成する鍵のタイプを指定できる
　-f [output_keyfile]    : 出力先ファイルを指定できる
　-N [new_passphrase]    : パスフレーズを指定。後からでも付けられるが最初に設定しよう（必須！）
　-C [comment]           : コメントは識別用の文字列で慣習的にemailを指定する（このオプションは使わなくても良い）
:::

``` terminal:暗号強度の確認
$ ssh-keygen -l -f ~/.ssh/id_ed25519.pub
# 今回の例では、「固定キー長：256bit」かつ、暗号化方式「Ed25519」が返ってくればOK
```
無事に秘密鍵（~/.ssh/id_ed25519）、公開鍵(~/.ssh/id_ed25519.pub)が生成された。

:::note alert
秘密鍵（id_ed25519）
・・秘密鍵は利用者本人以外に漏らしてはダメ
:::

:::note info
公開鍵（id_ed25519.pub）
・・公開鍵は他の人に渡ってもよい（むしろ公開する）
:::


### GitHubにSSH鍵（公開鍵）を登録する
(1) 公開鍵（id_ed25519.pub）をコピーする

``` terminal:公開鍵のcopy
$ pbcopy < ~/.ssh/id_ed25519.pub
``` 

(2) Githubにログインし、公開鍵を登録する
アカウントのアイコン > [Settings] > [SSH and GPG keys]と辿り、[New SSH key]を押下。
先程コピーした値をSSHkeyとして登録する。
※認証キーは、「Authentication」を選択

(3) Githubリポジトリ未作成の場合
Githubで「CreateRepository」ボタンを押してアプリのリポジトリを作成しましょう

### git/configの設定(macOS)
アプリケーションのディレクトリに移動し、以下のファイルにremote originを設定します

``` config:.git/config
[remote "origin"]
        url = git@github.com:[GithubUserName]/[RepositoryName].git
```

　　・[GithubUserName]・・・push先のユーザ名を指定
　　・[RepositoryName]・・・リポジトリ名（アプリ名）を指定
<font color="red">作成したGitHubリポジトリからSSH用のurlをコピーして、上記に貼り付けましょう</font>


### ssh/configの設定
以下のファイルにユーザを設定する。

``` ssh:.ssh/config
# 複数の接続先を登録してみる

# 接続先１
Host github.com                 # 接続ホスト名（自由に決めてOK）
  HostName github.com           # リモート先、サーバのホスト名やIPアドレス
  User git                      # リモート先、サーバのユーザー名
  Port 22                       # SSHのポート番号
  IdentityFile ~/.ssh/id_rsa    # 秘密鍵の絶対パス
  TCPKeepAlive yes              # 接続の有効無効の確認通知を出すかどうか（yes/no）
  IdentitiesOnly yes            # IdentityFileで指定した秘密鍵に限定するかどうか（yes/no）

# 接続先２ （サブユーザ）
Host github.com_sub
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/[サブユーザ用フォルダ]/id_rsa  # ユーザ毎にフォルダを作って整理すると良き
  TCPKeepAlive yes
  IdentitiesOnly yes
```

## SSHの接続確認（ローカル環境 ⇄ SSH接続 ⇄ Github）

- ターミナル上で以下のコマンドを実行し接続テストする

``` terminal:SSH接続のテスト
$ ssh -T git@github.com
Enter passphrase for key '/Users/username/.ssh/GithubUser/id_rsa': 
Enter passphrase for key '/Users/username/.ssh/GithubUser/id_rsa': 
Hi GithubUser! You've successfully authenticated, but GitHub does not provide shell access.
```
→最後の行のメッセージが表示されれば接続成功！


- エラーが発生した場合は、デバックモードで詳細を確認する

``` terminal:デバッグモードで接続テストを実行
$ ssh -vT git@github.com

# どこのSSH設定ファイルを読み込んでいるか？
debug1: Reading configuration data /Users/username/.ssh/config
debug1: Reading configuration data /Users/username/ssh_config
# 〜中略〜

# 公開鍵の追加先はどこか？
debug1: Host 'github.com' is known and matches the RSA host key.
debug1: Found key in /Users/username/.ssh/known_hosts:1
# 〜中略〜

# どこの秘密鍵を読み込んでいるか？
debug1: Trying private key: /Users/username/.ssh/id_dsa
debug1: Trying private key: /Users/username/.ssh/id_ecdsa
``` 


# gitの設定〜GitHubにpushするまで 
## git ユーザーを確認する
現在のgitのユーザ名、メールアドレスが適切か確認します。

``` terminal:git設定の確認
$ git config user.name #ユーザ名の確認
$ git config user.email #メールアドレスの確認
``` 

### リモートリポジトリへのプッシュ
以下は、ローカル環境でカレントリポジトリに変更を追加してコミットした後、GitHubのリモートリポジトリに変更をプッシュする手順です。

```terminal: リモートリポジトリ（GitHub）にpushする
# リモートリポジトリのトラッキングを追加する
git remote add origin git@github.com:GithubUserName/YourRepositoryName.git

# 追加したトラッキングが正しく反映されているかを確認する
git remote -v

# もし誤ったトラッキングが設定されていた場合は、トラッキングを削除する
git remote rm origin

# ローカルのmasterブランチを、GitHubのremote originのmasterブランチにプッシュする
git push -u origin master

# 備考
# 上記のpushコマンドは初回実行以降、git pushのみで使用できます
```