H2O + Let's Encrypt で SSL Server Test A+ 評価を取る設定

概要

H2O と Let's Encrypt を利用して、SSL 脆弱性診断サービス SSL Server Test で最高ランク A+ を取得できたため、設定内容を公開します。

f:id:yuu2634:20180618235626p:plain

(注)ランク A+ 達成後にも設定を複数追加しているため、下記の内容を全て揃える必要はありません。よりセキュアにするための項目も含まれています。


環境

今回利用した環境を以下に示します。必ずしも同一バージョンでなくても実現は可能です。

  • CentOS 7.5 (1804)
  • OpenSSL 1.0.2k
  • H2O 2.2.5
  • Let's Encrypt
  • サイトは完全 HTTPS 化済み


H2O の設定

h2o.conf の中から評価に影響する部分のみを抜粋して解説します。

hosts:
  "*:443":
    listen:
      port: 443
      ssl:
        minimum-version:  TLSv1
        certificate-file: "/etc/letsencrypt/live/xxxxxxxx/fullchain.pem"
        key-file: "/etc/letsencrypt/live/xxxxxxxx/privkey.pem"
        cipher-preference: server
        cipher-suite: "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:!DSS"
    paths:
      "/":
        file.dir: "/var/www/html"

    header.add: "Strict-Transport-Security: max-age=31536000"


HTTPS 通信の最低バージョンを TLSv1 としましたが、必要に応じて TLSv1.2 などに変更します。証明書と鍵は、Let's Encrypt で生成される場所を利用しています。

ssl:
  minimum-version:  TLSv1
  certificate-file: "/etc/letsencrypt/live/xxxxxxxx/fullchain.pem"
  key-file: "/etc/letsencrypt/live/xxxxxxxx/privkey.pem"


cipher-preference: server で、クライアント側ではなくサーバ側の暗号設定を優先させます。その上で、 cipher-suite: で利用できる暗号スイートを限定しています。

cipher-preference: server
cipher-suite: "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:!DSS"

ここは実際にテストを流して、指摘された暗号スイートを地道に取り除きました。OpenSSL 暗号スイート名のマッピングページ が参考になります。


HSTS の設定

ブラウザに HTTPS を強制させるための HSTS を設定します。この項目は一度設定すると取り消すことが困難なため、ただコピペせずに意味を理解してから設定してください。

header.add: "Strict-Transport-Security: max-age=31536000"

HSTS を設定する前提として、該当するドメインのリソースは全て HTTPS でアクセスできるようにしておきます。サイトの完全 HTTPS 化後に設定しましょう。


CAA レコードの設定

上記までで A+ 評価は取得可能ですが、追加設定を行ないました。DNS に CAA レコードを登録すると、証明書発行元の認証局を指定することができます。

Let's Encrypt の認証局を指定することで、それ以外の認証局では証明書を発行できなくなります。(全認証局が対応しているわけではないですが)

f:id:yuu2634:20180618234440p:plain

Route53 上で CAA レコードを登録し、dig コマンドで確認しました。CAA の問い合わせに対応していない場合は G Suite Toolbox などでも確認できます。

$ dig +short spla2.yuu26.com CAA
0 issue "letsencrypt.org"

SSL Server Test でも認識されました。 f:id:yuu2634:20180618234955p:plain


まとめ

  • H2O + Let's Encrypt で A+ 評価を取得しました
  • 暗号スイートの限定と HSTS の有効化がポイントです
  • 可能であれば CAA レコード も設定しましょう

今回サンプルとして出した診断結果は次のリンクから確認できます。 https://www.ssllabs.com/ssltest/analyze.html?d=spla2.yuu26.com