3秒でわかる
秘密鍵と対になる、誰に配ってもよいほうの鍵。これで暗号化した内容は対の秘密鍵でしか戻せず、署名の検証やSSHの鍵認証の登録に使います。
もう少し詳しく
どういうものか
公開鍵は、秘密鍵と対になる鍵のうち、公開して構わないほうです。公開鍵で暗号化した内容は対応する秘密鍵でしか復号できず、秘密鍵で作られた署名が本物かどうかは公開鍵で確かめられます。この非対称な関係が公開鍵暗号の核心で、RSAやEd25519といったアルゴリズムがこの性質を数学的に成り立たせています。SSHでサーバーへ登録するのも、TLS証明書に入っているのも公開鍵です。
なぜ必要か
共通鍵だけの世界では、通信を始める前に鍵そのものを安全に相手へ渡す必要があります。しかし初対面のサーバーと安全な経路が無い状態で、その鍵をどう届けるのかという循環に陥ります。公開鍵は盗み見られても困らないので、この最初の一歩を通信路の上で行えます。ブラウザが初めて訪れるサイトと暗号化通信を確立できるのは、証明書に入った公開鍵を平文で受け取れるからです。
具体例
# 公開鍵の中身。1行のテキストで、これは配ってよい
cat ~/.ssh/id_ed25519.pub
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII... you@example.com
# サーバー側の登録先。1行1鍵で並べる
cat ~/.ssh/authorized_keys
# 秘密鍵から公開鍵は再生成できる。逆はできない
ssh-keygen -y -f ~/.ssh/id_ed25519
# 手元の鍵の指紋を確認して、登録済みのものと突き合わせる
ssh-keygen -lf ~/.ssh/id_ed25519.pubGitHubへ登録するのもこの .pub の1行です。
つまずきやすいところ
最も危険な取り違えは、拡張子の無いほうを秘密鍵と知らずに貼り付けてしまうことです。.pub が付いているほうが公開鍵で、付いていないほうは一生自分の手元に置きます。秘密鍵を誤って公開した場合、削除しても取り消しにはなりません。新しい鍵を作り直し、登録先すべてを差し替え、古い鍵を各サービスから消します。もうひとつは、公開鍵を持っているだけでは相手が本人だと保証されない点です。鍵と持ち主の対応を保証するのが証明書と認証局の役目で、SSHの初回接続で表示される指紋の確認もこの対応を人が確かめる作業です。
似た用語との違い
| 語 | 扱い |
|---|---|
| 公開鍵 | 配ってよい。暗号化と署名の検証に使う |
| 秘密鍵 | 絶対に配らない。復号と署名の作成に使う |
| 証明書 | 公開鍵と持ち主の対応を第三者が保証したもの |
覚え方
公開鍵は南京錠、秘密鍵はその鍵、と考えると役割が反転しません。錠前はいくつ配ってもよく、開けられるのは鍵を持つ人だけです。