秘密鍵・公開鍵を作成する（Mac）

よく忘れるので、SSH接続に使う秘密鍵・公開鍵を作成するコマンドをメモしておきます。

## 概要
GithubやBitbucketなど色々なサイトへのアクセスに使うので、鍵の発行のやり方（コマンド）をメモしておく。

## 秘密鍵・公開鍵を作成する (接続元 - クライアント)
下記コマンドにて、鍵を指定のフォルダに作成する。

```sh:ターミナル
$ install -m 0700 -d ~/.ssh
$ cd ~/.ssh

$ ssh-keygen -t rsa -b 4096 -C "hoge@example.com" -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):  <-- パスフレーズを入力（任意）
Enter same passphrase again:  <-- もう一度、パスフレーズを入力（任意）
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.

$ ls ~/.ssh
id_rsa  id_rsa.pub
```
※ id_rsa　　 （秘密鍵）・・・ クライアントPCに配置
※ id_rsa.pub （公開鍵）・・・ 接続対象サーバに登録

## 公開鍵を設置する（接続先 - サーバ）

カレントフォルダに「.ssh」がない場合は、下記コマンドで作成する。

```sh:ターミナル
$ install -m 0700 -d ~/.ssh
```

接続元（クライアントPC）で作成した公開鍵（id_rsa.pub）を「authorized_keys」に追記する。

```
$ vi ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```

## パスフレーズを変更する
パスフレーズを設定したが、変更したい場合に下記コマンドで変更できます。
( パスフレーズが未設定の鍵にパスフレーズを追加も可能 )

```sh:ターミナル
$ ssh-keygen -p {古いパスフレーズ} -N {新しいパスフレーズ} -f ~/.ssh/id_rsa
```
ヒストリーにパスワードを残したくない場合は、以下の方が良いかもしれません。

```sh:ターミナル
$ ssh-keygen -f ~/.ssh/id_rsa -p
Enter old passphrase:                  // -> 古いパスフレーズ
Key has comment '~/.ssh/id_rsa'
Enter new passphrase (empty for no passphrase):  // -> 新しいパスフレーズ
Enter same passphrase again:
Your identification has been saved with the new passphrase.
```
## 鍵の暗号強度の確認

```
$ ssh-keygen -lf ~/.ssh/id_rsa
4096 SHA256*******/*********************** hoge@MacBook-Air.local (RSA)
```

## 複数の公開鍵を使い分ける
接続時に -i オプションで鍵ファイルを指定することで、鍵を使い分けることができる。

```sh:ターミナル
$ ssh -i ~/.ssh/id_rsa.github -T git@github.com
```

~/.ssh/config に使用する鍵を列挙しておけば、鍵ファイルを勝手に探してくれます。

```sh:~/.ssh/config
IdentityFile ~/.ssh/id_rsa

Host github github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa.github

Host bitbucket
  HostName bitbucket.org
  User hoge
  IdentityFile ~/.ssh/id_rsa.bitbucket
```

OpenSSH 7.3以上の場合は、Includeが使えるので、個別ファイルに分割することもできるようです。

**[OpenSSHのバージョン確認]**

```sh:ターミナル
$ ssh -V
OpenSSH_7.4p1, LibreSSL 2.5.0
```

**[ファイル構成]**

```/Users/hoge/.ssh/
├─ conf.d
│   ├─ bitbucket
│   └─ github
├─ config
├─ id_rsa
├─ id_rsa.bitbucket
└─ id_rsa.github
```

**[各ファイルの内容]**

```/Users/hoge/.ssh/config
Host *
  IdentitiesOnly yes
  ServerAliveInterval 120
  ServerAliveCountMax 10
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes

Include conf.d/*
```

|キーワード|説明|
|:--|:--|
| IdentitiesOnly | 認証の際に、ssh_config ファイルで指定された秘密鍵のみを使用するよう指定。 |
| ServerAliveInterval | 一定期間サーバからデータが送られてこないときに、タイムアウトする秒数。 |
| ServerAliveCountMax | sshがサーバからの返答を確認するまでに、サーバ生存確認メッセージを何回まで送るか。 |
| TCPKeepAlive | システムが相手のマシンにTCP keepaliveメッセージを送るかを指定。これが送られると、接続の異常終了や相手マシンのクラッシュが正しく通知される。 |

```/Users/hoge/.ssh/conf.d/bithub
Host github
  HostName github.com
  User hoge
  IdentityFile ~/.ssh/id_rsa.github
```

```/Users/hoge/.ssh/conf.d/bitbucket
Host bitbucket
  HostName bitbucket.org
  User fuga
  IdentityFile ~/.ssh/id_rsa.bitbucket
```

## 多段SSH
自分のPC -> example(example.com) -> remotePC(172.0.0.1) へ接続する場合の記述。

```
Host example
    Hostname      example.com
    User          hoge
    IdentityFile  ~/.ssh/id_rsa

Host remotePC
    HostName      172.0.0.1
    User          fuga
    ProxyCommand  ssh -CW %h:%p -4 example
```

## 注意すること
パソコンが故障した場合などに、別のパソコンでサーバーにアクセスすることが出来ない。
そのような場合に備えて、秘密鍵ファイル( id_rsa )をバックアップしておく。

## 参考資料

- [ssh-keygenコマンド](https://euske.github.io/openssh-jman/ssh-keygen.html)
- [ssh-keygen-Linuxコマンド](https://webkaru.net/linux/ssh-keygen-command/)
- [「よく分かる公開鍵認証」～初心者でもよくわかる！](http://knowledge.sakura.ad.jp/beginner/3543/)
- [SSHの公開鍵を作成し、Githubに登録する手順する](http://monsat.hatenablog.com/entry/generating-ssh-keys-for-github)
- [複数の公開鍵を使い分ける](http://d.hatena.ne.jp/MIZUNO/20080705/1215238138)
- [お前らのSSH Keysの作り方は間違っている](http://qiita.com/suthio/items/2760e4cff0e185fe2db9)
- [`Include`キーワードで`ssh_config`を分割できるようになった件](http://qiita.com/masa0x80/items/ecb692ad93f7d06a07b0)
- [githubの複数アカウントの扱い方](https://qiita.com/okappy/items/8fb3dacf176b45db85eb)
- [configを書くことでsshを便利で簡単にしよう！](https://koejima.com/archives/583/)
* [多段 SSH で秘密鍵を「ローカルに持つ」パターンと「踏み台に持つ」パターン](https://qiita.com/mpyw/items/52488034f34a3eba85aa)