SSL証明書や .pem を触っていると、「秘密鍵」「公開鍵」「証明書」「認証局(CA)」「中間証明書」と言葉が次々出てきて、結局それぞれどういう関係なのか分からなくなりがちです。
この記事は、コマンドの前に知っておくとラクになる「鍵と証明書の関係」を、図を使ってかみ砕いて説明します。
1. 公開鍵暗号 — ペアになった2つの鍵
すべての出発点は、ペアになった2つの鍵です。
- 秘密鍵(private key) … 自分だけが持つ鍵。他人には渡しません。
- 公開鍵(public key) … 誰に配ってもいい鍵。秘密鍵から作られます。
この2つには、数学的に次の便利な性質があります。
ポイントは、公開鍵から秘密鍵を計算で求められないことです。だから公開鍵はばらまいて構いません。 鍵の正体は大きな数(RSA)や楕円曲線上の点(EC)で、実体は 秘密鍵ファイル(.key)や pem の中 に Base64 で入っています。
「鍵が証明書になったり鍵になったり」と混乱する原因の多くは、ここを飛ばしているせいです。鍵(key)と証明書(certificate)は別物で、証明書は鍵を包む“身分証”だと思ってください(次の章)。
2. 「公開鍵だけ」だと困ること — なりすまし
公開鍵暗号で安全に通信できそうですが、1つ穴があります。 あなたが受け取った公開鍵が、本当に相手のものか分からないのです。 悪い人が「これが ◯◯銀行の公開鍵ですよ」と偽の公開鍵を渡してきたら、あなたはそれを信じて暗号化してしまい、中身を読まれてしまいます(中間者攻撃)。
つまり、「この公開鍵は確かに ◯◯のものだ」と保証してくれる仕組みが要ります。 それが証明書と認証局(CA)です。
3. 証明書 — 公開鍵につけた“身分証”
証明書(certificate)は、ざっくり言うと
「この公開鍵は、確かに
www.example.comのものです」という情報に、信頼できる第三者がデジタル署名をつけたもの
です。中身はおおよそ次の要素でできています。
証明書(X.509)= 公開鍵につけた“身分証”
├─ Subject (持ち主) : www.example.com、会社名、所在地 など
├─ PublicKey (公開鍵) : 持ち主の公開鍵
├─ Validity (有効期間) : 2026-06-24 〜 2027-06-24 など
├─ Issuer (発行者) : 誰が保証したか(CAの名前)
└─ Signature (CAの署名) : 上の内容が改ざんされていないことの証明
「持ち主の情報」と「発行者の署名」がセットになっているので、証明書を見れば「この公開鍵は誰のもので、誰が保証しているか」が分かります。
証明書の中身(有効期限・発行者・フィンガープリントなど)を実際に見るコマンドは opensslコマンド総まとめ と pem ファイルとは? にあります。
4. 認証局(CA)と「信頼の連鎖」
では、その「信頼できる第三者」とは誰でしょう。これが認証局(CA: Certificate Authority)です。 有名どころでは Let’s Encrypt、DigiCert、Sectigo など。
ただ、CAも1段ではありません。実際はこんなチェーン(連鎖)になっています。
ブラウザは、サーバ証明書 → 中間証明書 → ルート証明書とたどり、最後に「自分が最初から信頼しているルート」に行き着けば「信頼OK」と判断します。これを信頼の連鎖(チェーン)と呼びます。
サーバに証明書を入れたのに「証明書チェーンが不完全」と怒られるのは、たいてい中間証明書の設置漏れです。サーバ証明書だけでなく、CAがくれた中間証明書も一緒に設置(連結)する必要があります。これが pem に証明書を複数連結する理由のひとつです。
5. 証明書ができるまで(CSR の出番)
サーバ証明書は次の流れで手に入ります。ここで .csr(証明書署名要求)が登場します。
- 秘密鍵は一度も外に出ません。CSR に入るのは公開鍵だけです。
- 最近は Let’s Encrypt のように、この一連を自動化(ACME / certbot)してくれる仕組みが主流です。
CSR の中身を確認するコマンドは pem ファイルとは? や コマンド総まとめ にあります。
6. ぜんぶ pem の中に入っている
ここまで来ると、最初の混乱「pem って鍵なの証明書なの?」が解けます。
- 秘密鍵も、公開鍵も、証明書も、CSRも、正体はただのデータです。
- それを Base64 でテキスト化して
-----BEGIN ...-----で挟んだ入れ物が PEM です。 - だから pem は中身が鍵のことも証明書のこともあり、両方と中間証明書をまとめて入れることもあります。
server.pem(1つのファイルに全部入れる例。サーバによってはこの形) ┌────────────────────────────────── │ -----BEGIN PRIVATE KEY----- ← あなたの秘密鍵 │ ...(Base64)... │ -----END PRIVATE KEY----- │ -----BEGIN CERTIFICATE----- ← サーバ証明書 │ ...(Base64)... │ -----END CERTIFICATE----- │ -----BEGIN CERTIFICATE----- ← 中間証明書 │ ...(Base64)... │ -----END CERTIFICATE----- └──────────────────────────────────
ファイル形式の違い(PEM/DER/PFX など)は 証明書ファイルの形式まとめ を、 実際に中身を見る・操作するコマンドは opensslコマンド総まとめ をどうぞ。
さいごに
- 秘密鍵は自分だけの鍵、公開鍵は配る鍵。ペアで動きます。
- 証明書は公開鍵につけた身分証で、CAが署名して「本物」を保証します。
- CAはチェーンになっていて、ルートまでたどれれば信頼OK。中間証明書の設置漏れに注意。
- これらは全部、PEM という入れ物に入って配られます。
ここがわかると、openssl のコマンドが「何をしているか」を読み解きやすくなります。



