SSL/TLS暗号設定ガイドライン~安全なウェブサイトのために(暗号設定対策編)~:IPA 独立行政法人 情報処理推進機構 を参考にして、実際にウェブサーバーのSSL設定をどう書けばよいのか?をメモしておきます。
(注意)元資料ではかなり細かく説明されています。ここではかなり簡略化しているので参考程度に読んで下さい。
設定するために決めておく主な項目
この資料を元にウェブサーバーを設定する場合、次の選択肢をそれぞれ決定してそれを基に設定していく(ものすごく簡略化している)。
- 次のどれを採用するか?
- 高セキュリティ型
- 推奨セキュリティ型
- 普通はこれでよさそう。
- セキュリティ例外型
- 暗号スイートに、ECDH / ECDHE(楕円曲線暗号を使った暗号アルゴリズム。鍵交換で使う)を使うかどうか?(使わない場合は「基本」の方を使う)
- ECDH / ECDHE はパテントリスクがあるらしい。
- 暗号スイートは、まずは「推奨セキュリティ型の設定例(楕円曲線暗号あり)」を参考にして設定しておき、SSL Server Test (Powered by Qualys SSL Labs) でテストしてみて、もし問題がありそうであれば、「推奨セキュリティ型の設定例(基本)」に切り替えればよさそう。
- HSTS(HTTP Strict Transport Security) を設定するかどうか?
- 一度有効にしてから無効にしたくなった場合、クライアント側の設定をコントロールするのが難しい。
- ブラウザ自体の HSTS関連設定も何かイマイチだった(一度、HSTSがセットされたウェブサイトに対して、後からそれを取り消す機能がちゃんと動かないことがあった)。
これを設定していると、そのウェブサイトに対して OWASP ZAP のようなツールで SSL通信をプロキシできない。
- OCSP Stapling を設定するかどうか?
- それ程面倒でもなさそうなので設定しておけばよさそう。
- Public Key Pinning を設定するかどうか?
- 証明書更新時などにトラブルの元になる覚悟が必要
- ちゃんとコントロールできる体制があるのであれば設定すればよい。
推奨セキュリティ型を採用した場合の設定例(Apache)
(中略)
# OCSP Stapling の設定をする場合は、ここに追記する。
## キャッシュサイズ 128,000 バイト
SSLStaplingCache shmcb:/tmp/stapling_cache(128000)
<VirtualHost *:443>
(中略)
SSLEngine on
# 証明書と鍵の設定
SSLCertificateFile /etc/ssl/chain.crt
SSLCertificateKeyFile /etc/ssl/server.key
SSLCertificateChainFile /etc/ssl/certs/sub.class1.server.ca.pem
SSLCACertificateFile /etc/ssl/certs/ca.pem
# 暗号スイート設定
## 推奨セキュリティ型の設定例(楕円曲線暗号あり)
SSLCipherSuite "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES1 28-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES 128-SHA:AES128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA:AES128-SHA:ECDH-E CDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-G CM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RS A-AES256-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES256-GCM-S HA384:AES256-SHA256:CAMELLIA256-SHA:AES256-SHA:ECDH-ECDSA-AES256-GCM-SH A384:ECDH-RSA-AES256-GCM-SHA384"
# プロトコルバージョン設定
SSLProtocol all -SSLv2 -SSLv3
# 暗号スイート順序サーバ優先設定
SSLHonorCipherOrder on
# OCSP Stapling の設定をする場合には、こちらにも記述が必要
SSLUseStapling on
(中略)
</VirtualHost>
(中略)
推奨セキュリティ型を採用した場合の設定例(nginx)
server {
listen 443 ssl;
(中略)
#証明書と鍵の設定
ssl_certificate /etc/ssl/chain.crt;
ssl_certificate_key /etc/ssl/server.key;
# 暗号スイート設定
## 推奨セキュリティ型の設定例(楕円曲線暗号あり)
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES1 28-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES 128-SHA:AES128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA:AES128-SHA:ECDH-E CDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-G CM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RS A-AES256-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES256-GCM-S HA384:AES256-SHA256:CAMELLIA256-SHA:AES256-SHA:ECDH-ECDSA-AES256-GCM-SH A384:ECDH-RSA-AES256-GCM-SHA384";
#プロトコルバージョン設定。Appendix B.2.3 も参照のこと
## nginx ver. 1.1.13/1.0.12 かつ OpenSSL ver. 1.0.1 以上 の場合はこちら
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
## そうでない場合はこちら
#ssl_protocols TLSv1;
# 暗号スイート順序サーバ優先設定
ssl_prefer_server_ciphers on;
# OCSP Stapling を使う場合の設定
## SSLが設定された複数のVirtual Hostがある場合は、全てOCSPを有効にしておく必要がある。
ssl_stapling on;
ssl_stapling_verify on;
# ssl_trusted_certificate:
# - ルートCA、中間証明書(必要なら) が pem形式で含まれている必要がある
# - なので、ssl_certificate で指定したファイルと同じでもよいこともありえる
ssl_trusted_certificate /etc/ssl/ca-certs.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 10s;
(中略)
}