3秒でわかる
対になる秘密鍵と公開鍵の組。片方で暗号化した内容はもう片方でしか戻せず、SSH接続やGitHubへのpushで合言葉のかわりに使われます。
もう少し詳しく
どういうものか
キーペアは、数学的に対応づいた秘密鍵と公開鍵の2つ1組のことです。公開鍵で暗号化した内容は対応する秘密鍵でしか復号できず、秘密鍵で作った署名は公開鍵で検証できます。公開鍵は誰に配ってもよく、秘密鍵は自分の手元から出しません。SSHログイン、GitHubへのpush、TLS証明書、コード署名はすべてこの仕組みの上に成り立っています。
なぜ必要か
パスワード認証には、通信路に秘密そのものを流すという弱点があります。総当たり攻撃も可能で、公開されたサーバーの22番ポートには毎分のように試行が来ます。キーペアなら、サーバーに置くのは公開鍵だけです。サーバーが乗っ取られても攻撃者が得るのは公開鍵で、それだけでは誰にもなりすませません。認証のたびにサーバーが乱数を出し、クライアントが秘密鍵で署名を返す形なので、秘密そのものはネットワークを流れません。
具体例
# 鍵を作る。Ed25519 は短くて速い現在の標準
ssh-keygen -t ed25519 -C "you@example.com" -f ~/.ssh/id_ed25519
# できるのは2ファイル
# ~/.ssh/id_ed25519 秘密鍵。絶対に配らない
# ~/.ssh/id_ed25519.pub 公開鍵。サーバーへ渡す
# 公開鍵をサーバーの authorized_keys へ登録する
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@203.0.113.10
ssh -i ~/.ssh/id_ed25519 user@203.0.113.10つまずきやすいところ
最も多い失敗は権限です。SSHは鍵の権限が緩いと接続を拒否します。~/.ssh は 700、秘密鍵は 600 にします。緩いまま接続すると Permissions 0644 for ... are too open が出ます。次に多いのが、秘密鍵と公開鍵を取り違えてサーバーへ秘密鍵を貼る事故です。サーバーへ渡すのは必ず .pub の付いたほうです。誤って秘密鍵を配ったり、リポジトリへコミットしたりした場合は、消すだけでは足りず作り直して登録し直します。
似た用語との違い
| 語 | 位置づけ |
|---|---|
| キーペア | 秘密鍵と公開鍵の組そのもの |
| パスフレーズ | 秘密鍵ファイル自体を暗号化するパスワード |
| 共通鍵 | 暗号化と復号に同じ鍵を使う方式 |
実際のSSH通信では、キーペアで相手を確かめたあと、速度のために共通鍵へ切り替えて本文をやり取りします。
覚え方
配ってよいほうには .pub が付いている、と拡張子で覚えます。手元のディレクトリで .pub の無いファイルを見かけたら、それは外へ出してはいけないほうです。