エラーメッセージ
Nginxの設定をテストしたり、サービスを再起動したりする際に、この警告が表示されることがあります。ターミナルでは通常、以下のように表示されます。
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/example.com.crt"
ウェブサイトは引き続きHTTPSで読み込まれ、Nginxもエラーにならずに起動します。しかし、SSLハンドシェイクを高速化する機能であるOCSPステープリングが無効になります。これが無効だと、訪問者のブラウザは証明書の失効確認のために認証局(CA)に問い合わせる必要があり、初回ページ読み込みに200msから500msの遅延が発生する可能性があります。
根本原因
OCSP(Online Certificate Status Protocol)ステープリングを使用すると、ブラウザに負荷をかけることなく、サーバー側で証明書の有効性を証明できます。このチェックを実行するには、Nginxがドメイン証明書からルートCAまでの完全なパスを認識している必要があります。
この警告が発生する原因は、ssl_certificateファイルにドメインの公開証明書のみが含まれており、**中間証明書(Intermediate Certificate)**が不足しているためです。中間証明書は、サイトと信頼されたルートCAをつなぐ架け橋の役割を果たします。これがないと、Nginxは「発行者(issuer)」を検証できず、ステープリングを断念します。
解決方法
この問題を解決するには2つの方法があります。最初の方法は業界標準であり、ほとんどの構成で推奨されます。
方法1:フルチェーン証明書を作成する(推奨)
ドメイン証明書と中間証明書を1つのファイルに結合します。ここでの順序が重要です。まずドメイン証明書を記述し、その後に中間証明書を記述する必要があります。
- 証明書ファイルを確認します。通常、
your_domain.crtとbundle.crt(またはintermediate.crt)があります。 catコマンドでこれらを結合します:
cat your_domain.crt intermediate.crt > your_domain_fullchain.crt
CAから複数の中間ファイル(例:intermediate1.crtとintermediate2.crt)が提供されている場合は、ドメイン -> 中間1 -> 中間2の順に重ねてください。
- Nginxのサイト設定(通常は
/etc/nginx/sites-available/内)を更新します:
server {
listen 443 ssl;
server_name example.com;
# 新しく結合したファイルを指定
ssl_certificate /etc/ssl/certs/your_domain_fullchain.crt;
ssl_certificate_key /etc/ssl/private/your_domain.key;
ssl_stapling on;
ssl_stapling_verify on;
}
方法2:ssl_trusted_certificateディレクティブを使用する
ファイルを個別に管理したい場合は、このディレクティブを使用して、発行者の証明書がどこにあるかをNginxに明示的に伝えます。これは、証明書がリーフ(ドメイン)とチェーン(中間)を分ける自動スクリプトで管理されている環境でよく使われます。
ssl_certificateはドメイン証明書のみを指すようにしておきます。- CAバンドルを指す
ssl_trusted_certificateディレクティブを追加します:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# OCSP用に発行者を明示的に定義
ssl_trusted_certificate /etc/ssl/certs/intermediate_bundle.crt;
ssl_stapling on;
ssl_stapling_verify on;
# OCSPルックアップにGoogleまたはCloudflareのDNSを使用
resolver 8.8.8.8 1.1.1.1 valid=300s;
resolver_timeout 5s;
}
検証
リロードする前に必ず作業内容を確認してください。Nginxの構文テストを実行します:
sudo nginx -t
警告が表示されなければ、成功のメッセージが表示されます。その後、Nginxをリロードして変更を適用します:
sudo systemctl reload nginx
OCSPステープリングが有効であることを確認するには、以下のOpenSSLコマンドを使用します:
openssl s_client -connect example.com:443 -status -servername example.com | grep -A 17 "OCSP response:"
出力結果からOCSP Response Status: successful (0x0)を探してください。これが表示されれば、サーバーは失効情報のステープリングに成功しています。
再発防止策
- フルチェーンへの切り替え: Let's EncryptをCertbotで使用している場合は、
cert.pemの使用をやめましょう。Nginxの設定では常にfullchain.pemを使用するようにしてください。 - プロバイダーのZIPファイルを確認: NamecheapやDigiCertから証明書をダウンロードする際は、「bundle」や「chain」という名前のファイルを探してください。これらを無視しないようにしましょう。
- 自動化の徹底: AnsibleやTerraformを使用している場合は、デプロイスクリプトがドメイン証明書とCAバンドルを自動的に単一のファイルに結合するように設定してください。

