Qualysの SSL Server TestでA+評価を取得した設定例(2017-01-15時点, CentOS7 + Apache HTTPD 2.4.6)

2017-01-15 時点で、以下の環境で Qualys SSL Labs の SSL Server Test で A+ 評価を取得できましたので、設定例として公開します。

```
OS:
$ cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core)

Apache HTTPD, mod_ssl, OpenSSLはCentOS7提供のRPMを利用:
httpd-2.4.6-45.el7.centos.x86_64
openssl-1.0.1e-60.el7.x86_64
openssl-libs-1.0.1e-60.el7.x86_64
mod_ssl-2.4.6-45.el7.centos.x86_64

証明書 : Let's Encrypt で取得したRSA 2048bit の証明書を使用

対象ドメイン : www.glamenv-septzen.net
```

"SSL Server Test" はセキュリティ専門会社のQualysが無償で提供している、証明書とSSL/TLSの設定についてセキュアな設定になっているか、代表的な既知の脆弱性が無いかなどをチェックしてくれるツールです。チェック対象のドメインには、インターネットから接続できる必要があります。
このratingが高くなるほど、そのサイトの証明書とSSL,TLS設定はよりセキュアな状態であると考えられます。

- [SSL Server Test (Powered by Qualys SSL Labs)](https://www.ssllabs.com/ssltest/index.html)
  - https://www.ssllabs.com/ssltest/index.html

Let's Encrypt で証明書を取得した流れについては以下参照：

- [CentOS7 + RPM版 Apache HTTPD 2.4.6 で Let's Encrypt 導入メモ : certbot, 2017年1月時点 - Qiita](http://qiita.com/msakamoto_sf/items/c699dd0e769733d42087)
  - http://qiita.com/msakamoto_sf/items/c699dd0e769733d42087

**注意：今後のSSL/TLS関連の発展や脆弱性動向により評価が変化する場合があります。あくまでも 2017-01-15 時点ではこうだった、という参考として本記事をご活用ください。**

# 方針

Webを中心としたソフトウェアの技術情報がメインの個人blogサイトですので、以下のような方針としました。

* 想定読者層から、古いブラウザ/スマホ端末/ガラケーでアクセスしてくる人は殆ど居ないと想定し、プロトコルバージョンをTLSv1.2のみに絞る。
* IE10以前, Android 4.x系以前, JDK 1.7以前 などサポート切れ含む古めのブラウザ・クライアントには対応しない。
* FS(Forward Secrecy)のみに絞り、さらに Apache HTTPD 2.4.6 だとDHE鍵パラメータをカスタマイズしてないようなので、DHE系のCipherSuiteは使わない。
  * => 鍵交換はECDHE系のみに絞る。想定読者層としてもECDHE系をサポートしていないブラウザ/クライアントからのアクセスは殆ど無いと想定。
  * => これを以て Logjam 対策とする。
  * なお、RHEL(ひいてはCentOS側)で独自にDHE鍵パラメータを指定できるようなパッチが当たっていないか調べてみたが、2017-01-15時点ではパッチ有無が不明に終わった。
* HTTP Strict Transport Security (HSTS) は有効化する。
  * 対象ドメインの下にサブドメインを作る予定が無いので、特に副作用は考えず、 includeSubDomains を指定。

※以下については、ぶっちゃけ、2017-01-15時点でこれら無しで A+ 評価取れてしまったので、時間の都合 + 対応する動機が無くなったため、見送ってます。

* HSTS Preload
* Certificate Transparency
* Public Key Pinning (HPKP)
* DNS Certification Authority Authorization (CAA)
  * (DNS CAAの参考資料は後述)
  * 今回の対象ドメインはお名前.comのDNSレコード設定機能でDNS設定をしているが、2017-01-15時点ではCAAレコードタイプをサポートしていなかったため、諦めた。
  * (ドメインNavi ->「ドメイン設定」->「ネームサーバーの設定」->「DNS関連機能の設定」->「DNSレコード設定」で、登録できるレコード設定に"CAA"が無かった。)

# 設定例

```/etc/httpd/conf.d/ssl.conf
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
# ...

# OCSP Stapling のキャッシュディレクトリとキャッシュサイズ指定
# デフォルトで SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
# となっていたので、ディレクトリをそこに揃えた。
SSLStaplingCache shmcb:/run/httpd/stapling_cache(128000)

<VirtualHost *:443>
# ...
<Directory "(...)">
    # ...
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</Directory>

SSLEngine on

# プロトコルの明示的な指定により、TLSv1.1/TLSv1.0/SSL3/SSL2 を無効化
# (Android 4.x 系, IE10以前は切り捨てる)
SSLProtocol TLSv1.2

# CipherSuiteを ECDHE + AES 系のみに絞る。
# (from https://mozilla.github.io/server-side-tls/ssl-config-generator/)
# -> IPA SSL/TLS暗号設定ガイドライン, C.2.2. OpenSSL 系での暗号スイートの設定例 からDHE系を外している。
# Apache HTTPD 2.4.6 のためDHE鍵パラメータを設定できなかったこともあり、
# DHE系を外すことでLogjam対策も完了したことにする。
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256

# 暗号スイート順序はサーバ側の順序を優先する設定を有効化
SSLHonorCipherOrder on

# 明示的にSSL圧縮をOFF
# (from https://mozilla.github.io/server-side-tls/ssl-config-generator/)
SSLCompression off

# OCSP Stapling 有効化
SSLUseStapling on
# (from https://mozilla.github.io/server-side-tls/ssl-config-generator/)
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off

SSLCertificateKeyFile   /etc/letsencrypt/live/www.glamenv-septzen.net/privkey.pem
SSLCertificateFile      /etc/letsencrypt/live/www.glamenv-septzen.net/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.glamenv-septzen.net/chain.pem

# ...
</VirtualHost>

```

https -> https リダイレクト設定:

```
<IfModule mod_rewrite.c>
RewriteEngine On
#...
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,redirect=301]
#...
</IfModule>
```

# テスト結果

* 設定前のRating : C
  * https://www.glamenv-septzen.net/images/20170115_https_rating/www.glamenv-septzen.net-ssllabs-20170115-01before.png

* **設定後のRating : A+**
  * https://www.glamenv-septzen.net/images/20170115_https_rating/www.glamenv-septzen.net-ssllabs-20170115-02after.png
     * (証明書が2つありますが、 `Certificate #2` については実験用の別のvirtual host用なのでスルーしてください。)
  * 数ヶ月前に別のサイトでチェックしたときは気づかなかったが、`Certificate #1` で `DNS CAA No` と表示されてる。現時点では A+ の評価に影響していないようなので、見送り。

# 参考資料

- [SSL/TLS暗号設定ガイドライン～安全なウェブサイトのために（暗号設定対策編）～：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/security/vuln/ssl_crypt_config.html)
  - https://www.ipa.go.jp/security/vuln/ssl_crypt_config.html
  - Apache HTTPD, nginx, IISなど主要なWebサーバのSSL/TLS設定が紹介されている。
  - 「高セキュリティ型」「推奨セキュリティ型」「セキュリティ例外型」として、典型的な設定パターンに分類して解説してくれているので、実用性が高い。

- [Generate Mozilla Security Recommended Web Server Configuration Files](https://mozilla.github.io/server-side-tls/ssl-config-generator/)
  - https://mozilla.github.io/server-side-tls/ssl-config-generator/
  - Mozilla によるSSL設定ファイルのジェネレータ。
  - 今回はこれを使って `Apache - Modern`, `Server Version 2.4.6`, `OpenSSL Version 1.0.1.e`, `HSTS Enabled (チェックON)` で生成した設定も参考にしている。

- [Let's EncryptのSSL証明書で、Qualys SSLTestでA+評価を獲得するには - Qiita](http://qiita.com/dseg/items/bab80f6f14349fcd9c22)
  - http://qiita.com/dseg/items/bab80f6f14349fcd9c22
  - nginxを使った記事ですが、大変参考になりました。

## OCSP Stapling

- [OCSP Stapling on Apache 14.04 using Lets Encrypt - DavidEndersby.me](https://www.davidendersby.me/2016/03/ocsp-stapling-apache-14-lets-encrypt/)
  - https://www.davidendersby.me/2016/03/ocsp-stapling-apache-14-lets-encrypt/
- [How to Configure OCSP Stapling in Apache and nginx - SSLMate Blog](https://sslmate.com/blog/post/ocsp_stapling_in_apache_and_nginx)
  - https://sslmate.com/blog/post/ocsp_stapling_in_apache_and_nginx

## Logjam 対策

- [Logjam: PFS Deployment Guide](https://weakdh.org/sysadmin.html)
  - https://weakdh.org/sysadmin.html
  - ここに Apache HTTPD 用の対策ガイドがあるのだが、以下の2パターンのみで、2.4.6 以前の場合どうなってるのか記述されてない？
      - Apache (2.4.8 and newer) and OpenSSL 1.0.2 or later => `SSLOpenSSLConfCmd DHParameters "{path to dhparams.pem}"`
      - Apache with LibreSSL, or Apache 2.4.7 and OpenSSL 0.9.8a or later => 証明書のPEMの後ろにDHE鍵パラメータのPEMを追記
- [Logjam Attack 対策を行う : アジャイル株式会社](https://www.agilegroup.co.jp/technote/logjam-attack.html)
  - https://www.agilegroup.co.jp/technote/logjam-attack.html
- [Logjam: TLS 脆弱性 (CVE-2015-4000) - Red Hat Customer Portal](https://access.redhat.com/ja/node/1475253)
  - https://access.redhat.com/ja/node/1475253
- [ssl - How to fix 'logjam' vulnerability in Apache (httpd) - Server Fault](http://serverfault.com/questions/693241/how-to-fix-logjam-vulnerability-in-apache-httpd)
  - http://serverfault.com/questions/693241/how-to-fix-logjam-vulnerability-in-apache-httpd

## HSTS

- [HTTP Strict Transport Security - Web セキュリティ | MDN](https://developer.mozilla.org/ja/docs/Web/Security/HTTP_Strict_Transport_Security)
  - https://developer.mozilla.org/ja/docs/Web/Security/HTTP_Strict_Transport_Security
- [HSTS (HTTP Strict Transport Security) の導入 - Qiita](http://qiita.com/takoratta/items/fb6b3486257eb7b9f12e)
  - http://qiita.com/takoratta/items/fb6b3486257eb7b9f12e
- [HTTP Strict Transport Security(HSTS) 対応 | blog.jxck.io](https://blog.jxck.io/entries/2016-04-11/strict-transport-security.html)
  - https://blog.jxck.io/entries/2016-04-11/strict-transport-security.html
- [常時SSL、技術者が注意すべき設定 | シマンテック](https://www.symantec.com/ja/jp/page.jsp?id=always-on-ssl-setting)
  - https://www.symantec.com/ja/jp/page.jsp?id=always-on-ssl-setting
- [cybozu.com を真に常時 SSL にする話 - Cybozu Inside Out | サイボウズエンジニアのブログ](http://blog.cybozu.io/entry/6096)
  - http://blog.cybozu.io/entry/6096
- [Google の透明性レポートと HSTS（HTTP Strict Transport Security）｜Cybertrust.ne.jp](https://www.cybertrust.ne.jp/journal/google-hsts.html)
  - https://www.cybertrust.ne.jp/journal/google-hsts.html

## http -> https リダイレクト設定

- [【Apache】HTTP/HTTPS共存　リダイレクト設定　Rewrite【SSL設定】 - Qiita](http://qiita.com/Yuki_BB3/items/f6979fae4a4816823057)
  - http://qiita.com/Yuki_BB3/items/f6979fae4a4816823057
- [http から https へのリダイレクトを行う httpd.conf (mod_rewrite)](https://snap.textfile.org/20160204220325/)
  - https://snap.textfile.org/20160204220325/
- [apacheでhttpへのアクセスをhttpsへ自動リダイレクトする - Qiita](http://qiita.com/sue71/items/100004b704b9ff129b09)
  - http://qiita.com/sue71/items/100004b704b9ff129b09

## DNS Certification Authority Authorization (CAA)

- [DNS Certification Authority Authorization (CAA) | GMOグローバルサインブログ](https://jp.globalsign.com/blog/2013/caa.html)
  - https://jp.globalsign.com/blog/2013/caa.html
- [CAA Record Generator](https://sslmate.com/labs/caa/)
  - https://sslmate.com/labs/caa/
  - こちらの解説によると、現在CAAレコードをサポートしているDNSサーバは BIND , NSD, PowerDNS (>= 4.0.0), Knot DNS (>= 2.2.0), Google Cloud DNS
  - RFC3597 を使うとUnknownなDNSレコードタイプも使えるようだが、調べきれず、今回はギブアップ。
- [ssl - Let's Encrypt -- "DNS ... query timed out looking up CAA for ..." - Server Fault](http://serverfault.com/questions/749427/lets-encrypt-dns-query-timed-out-looking-up-caa-for?rq=1)
  - http://serverfault.com/questions/749427/lets-encrypt-dns-query-timed-out-looking-up-caa-for?rq=1
- [Domain with active CAA record in DNS - Issuance Policy - Let's Encrypt Community Support](https://community.letsencrypt.org/t/domain-with-active-caa-record-in-dns/8878/5)
  - https://community.letsencrypt.org/t/domain-with-active-caa-record-in-dns/8878/5
- [What is a CAA record? - DNSimple Help](https://support.dnsimple.com/articles/caa-record/)
  - https://support.dnsimple.com/articles/caa-record/
- [サポートされる DNS リソースレコードタイプ - Amazon Route 53](http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/ResourceRecordTypes.html)
  - http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/ResourceRecordTypes.html
  - 2017-01-15時点で、 Amazon Rote53 でもCAAレコードは未サポート