LoginSignup
31
33

More than 5 years have passed since last update.

Let's Encrypt と Nginx で Qualys SSL Labs の評価をAにする

Last updated at Posted at 2016-07-13

ちょうど自社で新しく立てたサーバのSSL対応をする必要があり、良いタイミングでtakorattaさんが、HTTPSにまつわる怪しい伝説を検証する - Google I/O 2016のセッションからという記事を書いてくれていたので、その中にあった Let's Encrypt と Mozilla SSL Configuration Generator を使い、Qualys SSL Labs での評価がAになるセキュアなウェブサイトを構築してみました。

環境は Ubuntu 16.04 + Nginx 1.10.0 で試しました。

letsencrypt で証明書をつくる

letsencrypt をインストールして、証明書を作ります(環境によってはcertbotというコマンド名になっているらしい)

インストール

sudo apt-get install letsencrypt

証明書をつくる

sudo letsencrypt certonly

ドメイン名やメールアドレスなどを聞かれるので応えると、/etc/letsencrypt/live/[ドメイン名]/に以下の4つのファイルができます。

% ls /etc/letsencrypt/live/[ドメイン名]/
ert.pem  chain.pem  fullchain.pem  privkey.pem

有効期限の更新をする設定をする

Let's Encrypt 認証局が発行する証明書の有効期間は短期間(90日間)で、少なくとも、3か月に一回は、証明書を更新する必要があります。
この期限を更新するスクリプトを cron に仕込んでおきます。

su - root
crontab -e
で
00 05 01 * * /usr/bin/letsencrypt renew
を追加

DH鍵をつくる

DH鍵交換に使用するファイルを作成します。

openssl dhparam 2048 -out /etc/nginx/dhparam.pem

nginx の設定

https://mozilla.github.io/server-side-tls/ssl-config-generator/
にて最適な config を作れます。

Kobito.2lnY6Z.png

Nginx(1.10.0) - ssl 1.0.2g - Intermediate - HSTS ON にて設定。表示されたコンフィグの中で、証明書を指定する場所などを書き換えて、nginx の config ファイルに記述すればOKです。
Intermediate を Modern に変更すると、対応するTLSのバージョンが少なくなり、古いブラウザが対象外になります。

実際にConfigを書き換えたものが以下の設定。

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /etc/letsencrypt/live/[domain_name]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[domain_name]/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /etc/nginx/dhparam.pem;

    # intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers '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:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    ## verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /etc/letsencrypt/live/[domain_name]/chain.pem;

    resolver 8.8.4.4 8.8.8.8 valid=300s;

    ....
}

デフォルトの部分から変更した部分は以下の5行になります。

    ssl_certificate /etc/letsencrypt/live/[domain_name]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[domain_name]/privkey.pem;
    ssl_dhparam /etc/nginx/dhparam.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/[domain_name]/chain.pem;
    resolver 8.8.4.4 8.8.8.8 valid=300s;

無事 Qualys SSL Labs がAをくれました。Yay!

Kobito.leyXZu.png

31
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
33