はじめに
サーバーをHTTPSで公開しようとすると必ず出てくるのが「証明書」です。ブラウザで鍵マークが表示されるあの仕組みですが、「なぜ必要なのか」「誰が発行しているのか」「誰が何のために使うのか」を順を追って説明できる人は意外と少ないのではないでしょうか。
本記事では、証明書がそもそも何を解決するための仕組みなのかという基礎の部分から、実際にどう検証されているのかという少し踏み込んだ部分まで、まとめて解説します。
なぜ証明書が必要なのか
まず「困りごと」から考えます。インターネット上でブラウザとサーバーが通信するとき、次の2つの問題が起こり得ます。
- なりすまし:本物そっくりの偽サイトが「私が本物のサーバーです」と名乗ってきても、ブラウザ側には見分ける手段がない
- 盗聴・改ざん:暗号化されていない通信は、途中の経路(公衆Wi-Fiなど)で盗み見られたり書き換えられたりする可能性がある
証明書は、この2つの問題をまとめて解決するための仕組みです。「本当にそのドメインの持ち主が運営しているサーバーであること」を第三者が保証し、かつ「暗号化通信に使う鍵」を安全に受け渡す役割を担っています。
証明書とは何か
証明書(SSL/TLS証明書) は、サーバーの身元を証明する電子的なファイルです。技術的にはX.509という規格に沿ったデータ形式になっており、主に次のような情報が含まれています。
| 項目 | 内容 |
|---|---|
| サブジェクト(Subject) | この証明書が誰(どのドメイン)のものかを示す情報 |
| 公開鍵(Public Key) | 暗号化通信に使う鍵の一方(後述) |
| 発行者(Issuer) | この証明書を発行した認証局の情報 |
| 有効期間 | この証明書がいつからいつまで有効か |
| デジタル署名 | 発行者が「この内容は本物です」と保証した署名 |
イメージとしては、「ドメイン名」「公開鍵」「有効期限」などが書かれた身分証明書に、発行元がハンコ(署名)を押したもの、と考えると分かりやすいと思います。
誰が発行するのか:認証局(CA)
証明書は自分で名乗るだけでは意味がなく、第三者による裏付けが必要です。この裏付けを行う組織が認証局(CA: Certificate Authority) です。
代表的な認証局には、DigiCert、Sectigoといった商用の認証局のほか、Let's Encryptのように無料かつ自動で証明書を発行してくれる非営利の認証局もあります。近年は、サーバー構築を自動化する流れの中で、Let's Encryptのように自動発行の仕組みを持つ認証局が広く使われるようになっています。
認証局はどうやってドメインの持ち主だと確認するのか
認証局が証明書を発行する前には、申請者が本当にそのドメインを管理しているかどうかの確認(ドメイン認証)が行われます。Let's Encryptを含む多くの自動発行の仕組みでは、ACMEというプロトコルに基づいて次のような「チャレンジ」で確認します。
| チャレンジ方式 | 確認方法 | 特徴 |
|---|---|---|
| HTTP-01 | 指定されたファイルをhttp://ドメイン/.well-known/acme-challenge/配下に設置し、認証局がそれを取得できるか確認する |
手軽で自動化しやすいが、ワイルドカード証明書の発行には使えない |
| DNS-01 | 指定された値をドメインのDNS TXTレコード(_acme-challenge.ドメイン)に登録し、認証局がDNSを引いて確認する |
ワイルドカード証明書を発行できるが、DNS側のAPI対応が必要 |
たとえば*.example.comのようなワイルドカード証明書(そのドメインの任意のサブドメインをまとめてカバーする証明書)を取得したい場合は、DNS-01チャレンジが必須になります。DNSプロバイダのAPIを使ってTXTレコードを自動登録し、認証局がそれを確認できれば発行が完了する、という流れです。
信頼の連鎖(チェーン・オブ・トラスト)
認証局は1段構成ではなく、多くの場合「ルート証明書」と「中間証明書」という階層構造になっています。
- ルート証明書:認証局自身が自分の身元を自分で保証(自己署名)している、信頼の最上位に位置する証明書。あらかじめOSやブラウザに組み込まれている
- 中間証明書:ルート証明書から署名を受けた、実際にサーバー証明書へ署名する役割の証明書
- サーバー証明書(リーフ証明書):実際にサーバーへインストールされる、ドメインごとの証明書
ブラウザは「サーバー証明書 → 中間証明書 → ルート証明書」と署名を順にたどり、最終的にあらかじめ信頼しているルート証明書に行き着けば「このサーバー証明書は信頼できる」と判断します。この一連のつながりをチェーン・オブ・トラストと呼びます。
誰が使うのか
証明書に関わる立場は大きく2つに分けられます。
- サーバー運営者:認証局に申請して証明書を取得し、自分のサーバーへ設置する側
- クライアント(ブラウザ等):受け取った証明書が信頼できるものかどうかを検証する側
ブラウザやOSには、あらかじめ多数の信頼された認証局のルート証明書が組み込まれています(トラストストア)。この一覧に含まれる認証局から発行された証明書であれば、ユーザーが意識することなく「安全な通信」として扱われます。
実際にどう使われるのか:TLSハンドシェイクの流れ
証明書は、HTTPS通信の最初に行われるTLSハンドシェイクという手続きの中で使われます。大まかな流れは次の通りです。
- クライアント(ブラウザ)がサーバーに接続を要求する(Client Hello)
- サーバーが自分の証明書を提示する(Server Hello + Certificate)
- クライアントは、その証明書をチェーン・オブ・トラストに沿って検証する(署名は正しいか、有効期限内か、ドメイン名は一致しているか)
- 検証に成功したら、証明書に含まれる公開鍵を使って、これから使う暗号化通信用の鍵(共通鍵)の情報を安全にやり取りする
- 以降のやり取りは、その共通鍵を使った暗号化通信で行われる
ここで登場する「公開鍵」と対になっているのが、サーバー側だけが持つ「秘密鍵」です。証明書に含まれる公開鍵で暗号化した内容は、対応する秘密鍵を持つサーバーでなければ復号できません。この仕組みにより、途中の経路で盗聴されても内容を読み取られにくくなります。
「暗号化されているかどうか」と「なりすましでないかどうか」は別の話です。証明書は、この2つを両方まとめて保証する役割を担っています。単に暗号化するだけなら自己署名証明書でも可能ですが、それだけでは「本物のサーバーである」という第三者による保証がありません。
証明書の種類
証明書は、確認の厳格さによっていくつかの種類に分けられます。
| 種類 | 略称 | 確認内容 |
|---|---|---|
| ドメイン認証 | DV(Domain Validation) | ドメインの管理権限のみを確認する。最も簡易で、Let's Encryptもこの形式 |
| 組織認証 | OV(Organization Validation) | ドメインに加え、運営組織の実在性も確認する |
| 拡張認証 | EV(Extended Validation) | 最も厳格な審査。かつてはブラウザのアドレスバーに組織名が表示される優遇があったが、現在は主要ブラウザでの表示上の区別はほぼなくなっている |
また、発行元という観点では、正規の認証局を介さず自分で署名する自己署名証明書もあります。社内検証用途などでは使われますが、ブラウザのトラストストアに含まれていないため、ブラウザからは「この接続は保護されていません」といった警告が表示されます。
実務上のポイント
-
ワイルドカード証明書の使い回し:
*.example.comのようなワイルドカード証明書を1枚発行しておけば、サブドメインが増えるたびに個別発行する必要がなくなり、運用がシンプルになる - 証明書の切り替え手順:複数の公開先(リバースプロキシのホスト設定など)で同じ証明書を共有している場合、新しい証明書へすべての参照先を切り替え終えてから古い証明書を削除する。切り替え途中で古い証明書を消すと、関連する設定の再読み込みが失敗し、無関係な公開先まで巻き添えでアクセス不能になることがある
- 有効期限切れの警告:証明書には必ず有効期限があり、Let's Encryptの証明書は90日と比較的短い。自動更新の仕組み(cronによる定期実行など)を組んでおかないと、気づかないうちに期限切れになりやすい
- 自己署名証明書の警告:開発環境などで自己署名証明書を使うと、ブラウザで警告が出るのは異常ではなく仕様通りの挙動。正規の認証局を経由していないため当然の反応
まとめ
| 疑問 | 答え |
|---|---|
| 証明書とは何か | サーバーの身元を保証し、暗号化通信の鍵を安全に受け渡すための電子的な証明書 |
| なぜ必要か | なりすまし防止と盗聴・改ざん防止のため |
| 誰が発行するか | 認証局(CA)。Let's Encryptのように無料・自動で発行する認証局もある |
| どう確認されるか | HTTP-01/DNS-01などのチャレンジでドメインの管理権限を確認し、ルート証明書からのチェーン・オブ・トラストで信頼性を検証する |
| 誰が使うか | サーバー運営者(取得・設置)とクライアント(検証)の双方 |