【Mac】SSHで使う秘密鍵と公開鍵の作り方

今回はSSH接続をより安全に行うための秘密鍵と公開鍵の作り方を紹介します。

 

秘密鍵・公開鍵を作成

$ 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は公開鍵です。接続するサーバーに配置しましょう。公開鍵は基本的にauthorized_keysという名前にリネームします。

 

公開鍵を設定

サーバー側で公開鍵を設置します。

カレントフォルダに「.ssh」がない場合は以下のコマンドを入力して作りましょう。

$ install -m 0700 -d ~/.ssh

 

次にクライアント側のPCで作成した公開鍵(id_rsa.pub)をauthorized_keysに追記します。

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

 

パスフレーズを変更する場合

パスフレーズはすでに設定しましたが、もし変更したい場合は以下のコマンドで変更することができます。パスフレーズを未設定の場合にやっぱり設定するということも可能です。

$ ssh-keygen -p {古いパスフレーズ} -N {新しいパスフレーズ} -f ~/.ssh/id_rsa

 

鍵の暗号の強度を確認

以下のコマンドで確認できます。

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

 

複数の公開鍵を使用する

SSHで接続するときに -i オプションで鍵ファイルを指定することで、公開鍵を使い分けることもできます。

 ssh -i ~/.ssh/id_rsa.github -T git@github.com

 

また、~/.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のバージョンは以下のコマンドで確認しましょう。

$ ssh -V
OpenSSH_7.4p1, LibreSSL 2.5.0

 

ファイル構成

今回の鍵作成でファイル構成は以下のようになりました。

/Users/ユーザー名/.ssh

├─ conf.d
│   ├─ bitbucket
│   └─ github
├─ config
├─ id_rsa
├─ id_rsa.bitbucket
└─ id_rsa.github

 

/Users/ユーザー名/.ssh/configの内容はこんな感じ。

Host *
  IdentitiesOnly yes
  ServerAliveInterval 120
  ServerAliveCountMax 10
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes

Include conf.d/*

 

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

 

/Users/ユーザー名/.ssh/conf.d/githubは以下の通り

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

 

/Users/ユーザー名/.ssh/conf.d/bitbucketは以下の通り

Host bitbucket
  HostName bitbucket.org
  User fuga
  IdentityFile ~/.ssh/id_rsa.bitbucket

 

注意点

万が一パソコンが壊れてしまった場合に、別のパソコンでサーバーにアクセスができないので注意しましょう。

対策として、秘密鍵のバックアップを取っておくことをお勧めします。