シナプス技術者ブログ

シナプスの技術者公式ブログ。インターネットで、鹿児島の毎日を笑顔にします。

Qualys SSL Labs の SSL Server Test で全項目100点をとるためにした事

シナプスの技術部システム開発課の小園です。
Qualys SSL Labs の SSL Server Test で全項目100点を取ろうと思い、検証した事を記事にしました。

Qualys SSL Labs - SSL Server Test とは

  • Qualys SSL Labs 社が提供する、SSLサーバ証明書の設定状況の確認や安全性診断などが無料で行えるサイトです。
    www.ssllabs.com
  • Certificate (証明書)、Protocol Support (プロトコルのサポート)、Key Exchange (鍵交換)、Cipher Strength (暗号強度)の各項目を100点満点で採点します。

環境

  • OS
    • CentOS Linux release 7.8.2003 (Core)
  • HTTPサーバ
    • nginx version: nginx/1.19.3
      nginxのmainline版。検証時の最新バージョンです。 nginx.org
  • TLSプロトコルの実装
    • OpenSSL 1.0.2k-fips
      CentOS 7 標準レポジトリのバージョンです。
  • 証明書発行

検証について

  • 検証は2020年10月中旬頃おこなっています。
    その後のSSL Server Testの仕様変更によっては、以下内容と同等の設定にしても同じ結果にならない場合があります。
  • 検証は、test.synapse.jpとは異なるドメインで行っています。
    そのため、若干の差異があるかもしれません。
  • CentOS7、OpenSSL 1.0.2k という組み合わせなので、TLS1.2 での検証になります。
  • 以下の理由により、実際の環境に投入することはお勧めできません。
    • 全項目満点にする過程で、古めのブラウザを切り捨てることになります。
    • TLS 1.2について定義している RFC5246 の中で Mandatory Cipher Suites(必須の暗号スイート)として、TLS_RSA_WITH_AES_128_CBC_SHA が指定されています。
      この検証の中では、TLS_RSA_WITH_AES_128_CBC_SHA を無効にしています。
      tools.ietf.org

まずは構築して、計測してみる。

  • Mozilla SSL Configuration Generator で生成される設定を元に、構築します。
    ssl-config.mozilla.org
server {
    listen 80;
    root /var/www/html;
    index index.html;
    server_name test.synapse.jp;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl http2;

    root /var/www/html;
    index index.html;
    server_name test.synapse.jp;

    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log error;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;

    ssl_dhparam /etc/nginx/dhparam;
    ssl_protocols TLSv1.2;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    ssl_ecdh_curve secp521r1:secp384r1;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=63072000" always;

    ssl_stapling on;
    ssl_stapling_verify on;

    resolver 127.0.0.1;

    ssl_certificate /etc/letsencrypt/live/test.synapse.jp/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/test.synapse.jp/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/test.synapse.jp/chain.pem;

    add_header X-Frame-Options SAMEORIGIN;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options nosniff;
    add_header Referrer-Policy same-origin;
}
  • /etc/nginx/dhparam はどちらかの方法で用意します。
$ curl https://ssl-config.mozilla.org/ffdhe2048.txt > /etc/nginx/dhparam
$ openssl dhparam -out /etc/nginx/dhparam 2048
  • Let's Encrypt で証明書を取得します。
$ certbot certonly --webroot -w /var/www/html -d test.synapse.jp --agree-tos --register-unsafely-without-email --quiet
  • 証明書の確認をします。
$ certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: test.synapse.jp
    Serial Number: 49af489922ba4ac5b7b17f9f3db49b0e737
    Domains: ssllab.kozono.org
    Expiry Date: 2021-01-18 03:06:48+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/test.synapse.jp/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/test.synapse.jp/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  • nginx の設定を確認して、再起動します。
    • 実際に作業する場合には、80番(HTTP)のみ先に立ち上げて、証明書を作成して、その後 TLS の設定になると思います。
$ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ systemctl restart nginx
  • 計測します。 f:id:oceandepthz:20201020132931p:plain

  • Key Exchange と Cipher Strength が90点。他が100点という結果でした。
    (実運用上は、これで十分なんじゃないかという気もします。)

Cipher Strength (暗号強度)を100点へ

  • ciphers を色々と無効にした結果、以下2つが残りました。
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
  • cipher ECDHE-RSA-AES256-SHA384 は WEEK との情報が出るが100点にはなる。
    無効にした場合には、幾つかの古いブラウザが対応出来ません。

  • 計測します。 f:id:oceandepthz:20201020143151p:plain

  • Cipher Strength (暗号強度)が、無事100点になりました。

Key Exchange (鍵交換)を100点へ

  • TLS証明書のRSA鍵を4096bitへ変更します。
$ certbot renew --force-renewal --cert-name test.synapse.jp --rsa-key-size 4096
  • 計測します。 f:id:oceandepthz:20201020150246p:plain

  • 全項目100点になりました。

まとめ

  • 冒頭にも記載しましたが、古めのブラウザへの対応や、RFCへの準拠などの問題は残ります。
    全てを満たす事は出来ないので、トレードオフになると思います。
  • DNS CAA、ECDSAな証明書、TLS1.3などもいつか検証できたらと思います。
  • 最終的な診断結果の画像へのリンクを用意しました。(縦に長いので、リンクです。)
    https://cdn-ak.f.st-hatena.com/images/fotolife/o/oceandepthz/20201020/20201020163127.png