NginxでのOCSP Stapling対応設定

公開日: : 最終更新日:2014/09/02 サーバ , ,

意外にハマったのでメモ。

OCSPとは

OCSP(Online Certificate Status Protocol)とは、SSL/TLS暗号化通信の初期フェーズにおいて証明書の失効を確認するための手順。
従来は署名所失効リスト(CRL)が利用されていたが、CRLはリストが肥大化しダウンロードに非常に時間がかかるようになってきたため、単一レコードの取得で済むOCSPが、現在では証明書の失効を確認する方法として一般的になった。

OCSP Staplingとは

通常は以下の図のように、証明書をダウンロードしたクライアントがOCSP Responderにサーバ証明書の失効を確認する。
OCSP_1

OCSP Staplingに対応すると、以下の図のように証明書の失効確認をサーバ側で処理することができる。
また、OCSPレスポンスは一定の間はサーバにキャッシュされ、都度OCSP Responderに問い合わせる必要はない。
これによりクライアントとOCSP Responder間のラウンドトリップ時間をなくすことができるため、SSL/TLS通信の開始を早めることが可能となる。
OCSP_Stapling

OCSP Stapling対応状況の確認

opensslコマンドを以下のようにすることによりレスポンスから対応状況を確認することが出来る。

$ openssl s_client -connect <対象のFQDN>:443 -tls1 -status -reconnect 2>&1 < /dev/null | head

以下は、対応していない場合の例。

$ openssl s_client -connect hoge.com:443 -tls1 -status -reconnect 2>&1 < /dev/null | head
depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
verify return:0
CONNECTED(00000003)
OCSP response: no response sent
---
Certificate chain
・・・
・・・
・・・

上記例のように、「OCSP response: no response sent」と表示される場合はOCSPレスポンスを対象のサーバが返答していないので、OCSP Staplingには対応していないことを確認出来る。

OCSP StaplingのNginxでの設定

NginxのVer 1.3.7以降であればOCSP Staplingを設定することができる。

$ <code>which nginx</code> -v
nginx version: nginx/1.6.1

バージョンの確認が終わったら、SSLのサーバ設定ファイルに設定を追記していく。
追加する設定は以下のようになる。

    # 'OCSP Stapling’ setting
    ssl_stapling     on;
    ssl_stapling_verify     on;
    ssl_trusted_certificate     /etc/nginx/ssl/ca-certs.crt;
    resolver          8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout     5s;

今回はSSL設定の下辺りに記載しておいた。

上記のように設定することにより、OCSP Staplingへの対応ができる。
ディレクティブの一つ一つを簡単に以下に説明する。

  • ssl_stapling:
    OCSP Staplingを設定する場合は「on」にする
  • ssl_stapling_verify:
    サーバでOCSPレスポンスの確認をする場合は「on」にする
  • ssl_trusted_certificate:
    サーバ証明書を証明する証明局の証明書を指定する
  • resolver:
    名前解決の際に利用するDNSサーバを指定する
  • resolver_timeout:
    DNSリクエストのTimeout設定

詳しくは、公式ドキュメントを参照のこと。

ssl_trusted_certificateで指定する証明書の作成

ここがハマった。。。
ドキュメントとか読まずに、certificateとか名称に付いていたので、
「サーバ証明書を指定すればOK!」
と考えてしまったのが、そもそも間違い

公式ドキュメントを読めば、CAの証明書を指定しろって書いてあった・・・
なので、SSL証明書を確認して、その上位の証明書をダウンロードして指定すれば良い。
ただし、3層とか4層の証明書の場合は、中間証明書やクロスルート証明書も含めて、単一のファイルとして指定する必要がある。
以下は例。
まずは以下の1ライナーコマンドで現在インストールしてある証明書からルート証明がどこかを確認する。

$ IFSBAK=$IFS; IFS=':' certificates=$(openssl s_client -connect <対象のFQDN>:443 -showcerts -tlsextdebug -tls1 2>&1 </dev/null | sed -n '/-----BEGIN/,/-----END/ {/-----BEGIN/ s/^/:/; p}'); for certificate in ${certificates#:}; do echo $certificate | openssl x509 -noout -ocsp_uri; done; IFS=$IFSBAK

以下が結果例。

$ IFSBAK=$IFS; IFS=':' certificates=$(openssl s_client -connect hoge.com:443 -showcerts -tlsextdebug -tls1 2>&1 </dev/null | sed -n '/-----BEGIN/,/-----END/ {/-----BEGIN/ s/^/:/; p}'); for certificate in ${certificates#:}; do echo $certificate | openssl x509 -noout -ocsp_uri; done; IFS=$IFSBAK
http://rapidssl-ocsp.geotrust.com
http://ocsp.geotrust.com

上記の場合は、ルート証明局はGeoTrust。
なので、GeoTrustからルート証明書をダウンロードする。
GeoTrustはココからダウンロード出来るようだ。
上記サイトを確認して、

$ wget -O ca.root.crt https://www.geotrust.com/resources/root_certificates/certificates/Equifax_Secure_Certificate_Authority.pem

上記のようにダウンロードを実行。
あとは、NginxのSSL設定の際に中間証明書とクロスルート証明書は別途ダウンロードして設定したはずなので、そこから以下のようにしてssl_trusted_certificateで指定する証明書を作成する。

$ cat <中間証明書> <クロスルート証明書> root.ca.crt &gt; ca-certs.<code>date +'%Y%m%d'</code>.crt
$ ln -s ca-certs.<code>date +'%Y%m%d'</code>.crt ca-certs.crt

Nginxへの設定適用と確認

上記までの設定ができたらNginxを再起動する。

$ sudo service nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]

Nginxの再起動が完了したら、最初に確認したようにopensslコマンドで再度確認してみる。

$ openssl s_client -connect <対象のFQDN>:443 -tls1 -status -reconnect 2>&1 < /dev/null | head
depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
verify return:0
CONNECTED(00000003)
OCSP response:
======================================
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
    Responder Id: CN = RapidSSL TGV OCSP Responder
    ・・・・・
    ・・・・・

上記のようにOCSP responseが確認出来て、ResponseとしてOCSP Response Statusがsuccessfulとなっていれば対応完了!
また上記の様に結果が表示されなかった場合は、エラーログを確認してみる。
例えば、ssl_trusted_certificateで指定する証明書の内容が間違っている場合は、ログには以下のように出力される。

2014/08/22 17:31:53 [error] 49223#0: OCSP_basic_verify() failed (SSL: error:27069065:OCSP routines:OCSP_basic_verify:certificate verify error:Verify error:unable to get issuer certificate) while requesting certificate status, responder: rapidssl-ocsp.geotrust.com

この場合は、証明書の作成において、指定すべき証明書が足りなかったり、順序に間違いがあったりするはずなので確認してみる。

Adレクタングル[忍者ADMAX]

関連記事

nginx_logo

NginxでのSSL設定(もうちょっと詳しく)

単に、 とするだけではなくて…というエントリ。 ちなみにRHEL系を想定して書いている。 ngin

記事を読む

aws_logo._V400518270_

AWSでRoute 53をPrivate DNSとしてVPC内で使ってみた

Amazon Web Services(AWS)のRoute 53がVPC内でのPrivate Ho

記事を読む

RabbitMQ.sh-600x600

EC2上のRabbitMQをMulti-AZで冗長化

うーん。。。ハマった。 多分、もっとErlangのこと把握できていればよかったのだろうけど。

記事を読む

no image

dstat+td-agent+ElasticSearch+Graphite+Grafana on Amazon Linux

タイトルが異様に長いけど、業務でタイトルのようなパフォーマンス監視環境を作った。 難易度はそんなに

記事を読む

nginx_logo

ngx_pagespeed対応版nginxパッケージの作成(RHEL系)

インストールされているミドルウェアやアプリケーションはパッケージ化されていると、管理上において非常に

記事を読む

Comment

  1. […] 詳しくは「NginxでのOCSP Stapling対応設定」を読んでください。 […]

コメントを残す

Adレクタングル[忍者ADMAX]

RabbitMQ.sh-600x600
EC2上のRabbitMQをMulti-AZで冗長化

うーん。。。ハマった。 多分、もっとErlangのこと把握できていれ

aws_logo._V400518270_
AWSでRoute 53をPrivate DNSとしてVPC内で使ってみた

Amazon Web Services(AWS)のRoute 53がV

nginx_logo
NginxでのSSL設定(もうちょっと詳しく)

単に、 とするだけではなくて…というエントリ。 ちなみにRHEL系を

→もっと見る

  • Author:
    hiro
    Work:
    インフラエンジニア
    Brief History:
    新卒後、ソフトハウスにて受託開発を中心に開発エンジニアを始める。
    数年前から現在はITインフラが専門。
PAGE TOP ↑