サーバ証明書は何を証明するのか
サーバ証明書は、ドメイン名と公開鍵を結び付けるX.509証明書です。ブラウザはHTTPS接続時にサーバーから証明書を受け取り、証明書の署名、期限、対象ドメイン、信頼できる認証局へつながる証明書チェーンを検証します。
ここで重要なのは、証明書が「通信内容を暗号化する鍵そのもの」ではないことです。証明書には公開鍵が入っており、秘密鍵はサーバー側に保管されます。TLSハンドシェイクでは、サーバーが秘密鍵を持っていることを示しながら、この接続だけの共通鍵を合意します。
証明書に入る代表的な情報
現在のWebサーバ証明書では、接続先ホスト名は主にSAN(Subject Alternative Name)で確認されます。ブラウザはアクセス先のドメインがSANに含まれているかを見ます。
| 項目 | 意味 |
|---|---|
| Subject / SAN | 証明書の対象。example.com や www.example.com などのドメイン名 |
| Issuer | 証明書を発行した認証局または中間認証局 |
| Validity | 証明書の有効期間。期限切れの証明書は拒否される |
| Public Key | サーバーの秘密鍵に対応する公開鍵 |
| Signature | 認証局が証明書内容に付けた署名 |
| Key Usage | 証明書の用途。TLSサーバー認証など |
証明書チェーンと信頼の流れ
ブラウザは、サーバー証明書だけを単独で信じるわけではありません。サーバー証明書、中間証明書、ルート証明書という信頼の連鎖をたどります。ルート証明書はOSやブラウザの信頼ストアに入っているため、そこまで署名のつながりを確認できると信頼できます。
サーバ証明書
↓ 中間CAが署名
中間証明書
↓ ルートCAが署名
ルート証明書(ブラウザやOSが信頼済み)
Webサーバーには、サーバ証明書だけでなく中間証明書も正しく配信する設定が必要です。中間証明書が不足すると、自分の環境では開けても別の端末や古い環境で証明書エラーになることがあります。
Aレコード設定から発行までの全体像
ドメインに対して証明書を発行するには、認証局が「申請者はそのドメインを管理している」と確認できる必要があります。HTTP-01を使う典型的な流れでは、まずDNSのAレコードでドメインをサーバーのグローバルIPへ向けます。
sequenceDiagram autonumber participant Admin as 管理者 participant DNS as DNS participant Server as Webサーバー participant CA as 認証局 / ACME Admin->>DNS: example.comのAレコードにサーバーIPを設定 CA->>DNS: example.comの名前解決を確認 Admin->>Server: ACMEクライアントで証明書を申請 CA-->>Server: HTTP-01チャレンジ用トークンを指定 Server->>Server: /.well-known/acme-challenge/ にトークンを配置 CA->>Server: http://example.com/.well-known/acme-challenge/... を取得 Server-->>CA: 指定されたトークンを返す CA-->>Server: ドメイン管理を確認し、証明書を発行 Server->>Server: 証明書と秘密鍵をWebサーバーへ設定
実務での手順
たとえば example.com を新しいVPSやクラウドVMへ向け、そこで証明書を発行する場合は、次のような順序になります。
- ドメインを取得し、DNS管理画面を開く
- サーバーのグローバルIPアドレスを確認する
example.comのAレコードにそのIPv4アドレスを設定する- IPv6も使うならAAAAレコードにIPv6アドレスを設定する
- DNSの反映後、
example.comがサーバーIPへ解決されることを確認する - サーバー側で80番ポートと443番ポートを開ける
- CertbotなどのACMEクライアントで証明書を申請する
- HTTP-01またはDNS-01のチャレンジを完了する
- 発行された証明書をNginxやApacheへ設定する
- 自動更新と更新後のWebサーバー再読み込みを設定する
# 名前解決の確認例
dig example.com A
# サーバーに向いているか確認
curl -I http://example.com
HTTP-01では、認証局が外部から http://example.com/.well-known/acme-challenge/... にアクセスできる必要があります。CDN、WAF、リバースプロキシ、ファイアウォールでブロックされていると検証に失敗します。
HTTP-01とDNS-01の違い
ACMEでは、ドメイン管理権限を確認するためにチャレンジを使います。代表的なのがHTTP-01とDNS-01です。
| 方式 | 特徴 |
|---|---|
| HTTP-01 | 対象ドメインのHTTP URLへ指定トークンを置く。Webサーバーを公開している単一ドメインで扱いやすい |
| DNS-01 | 対象ドメインのDNS TXTレコードへ指定値を置く。ワイルドカード証明書や外部公開前のサーバーで使いやすい |
| TLS-ALPN-01 | 443番ポート上のTLS応答で検証する方式。環境により利用可否が分かれる |
ワイルドカード証明書、たとえば *.example.com を発行したい場合はDNS-01が必要です。一方、通常の example.com や www.example.com だけならHTTP-01でも十分なことが多いです。
秘密鍵とCSRの扱い
証明書発行では、秘密鍵と公開鍵のペアが中心になります。昔ながらの手順では、サーバー側で秘密鍵を作り、公開鍵やドメイン名を含むCSR(Certificate Signing Request)を作成し、認証局へ提出します。ACMEクライアントを使う場合も、内部では同じ考え方で鍵や申請情報を扱います。
証明書を更新するときに秘密鍵を再利用するか、新しい鍵を作るかは運用方針によります。漏えいが疑われる場合は、証明書の失効と鍵の作り直しが必要です。
インストール後に確認すること
証明書を発行しただけではHTTPSは有効になりません。Webサーバーが443番ポートでTLSを終端し、正しい証明書チェーンと秘密鍵を使うように設定します。
| 確認項目 | 見るポイント |
|---|---|
| ホスト名 | アクセスするドメインが証明書のSANに含まれているか |
| 期限 | 有効期限切れになっていないか、自動更新が動くか |
| チェーン | 中間証明書を含めてクライアントが信頼できるか |
| 秘密鍵 | 証明書に対応する秘密鍵をWebサーバーが読めるか |
| リダイレクト | HTTPからHTTPSへ誘導するか。ACME更新用のパスを壊していないか |
# 証明書の概要確認
openssl s_client -connect example.com:443 -servername example.com
# HTTPS応答の確認
curl -I https://example.com
よくある失敗
証明書まわりの失敗は、DNS、ネットワーク、Webサーバー設定、証明書チェーンのどこで止まっているかを分けると見つけやすくなります。
| 症状 | 原因の例 |
|---|---|
| 認証局の検証が失敗する | Aレコードが別IPを向いている、80番ポートが閉じている、チャレンジURLがリダイレクトやWAFで壊れている |
| ブラウザで名前不一致 | www ありなしなど、アクセス先ドメインがSANに入っていない |
| 一部端末だけエラー | 中間証明書の配信不足、古いルート証明書、時刻ずれ |
| 更新に失敗する | 初回発行後に80番ポートを閉じた、DNS API権限が失効した、更新後のreloadが動いていない |
まとめ
サーバ証明書は、ドメイン名と公開鍵を認証局の署名で結び付ける仕組みです。発行の実務では、ドメインのAレコードをサーバーIPへ向け、認証局がHTTP-01やDNS-01で管理権限を確認し、証明書を発行します。発行後は証明書チェーン、秘密鍵、Webサーバー設定、自動更新まで含めて運用することが大切です。
詳細は RFC 5280(X.509 PKI)、RFC 8555(ACME)、Let’s Encrypt Challenge Types を参照してください。