WordPressのHTTPSサイトをA+評価にする

SSL Labsでこのブログを診断してもらったところ「B」評価だったので、最高評価のA+を目指して修正する。

またHTTPS通信の高速化も目指して修正する。

SSL/TLSについては、IPAからガイドラインが出てるので、読んどくといい。

nginxのSSL設定用confファイル作成

わかりやすくするため、SSL専用のconfファイルを作る。

sudo vim /etc/nginx/conf.d/ssl.conf

SSL設定が下記。細かな説明は記事の下らへんに。

# SSLセッションキャッシュを全てのワーカープロセスで共有
ssl_session_cache shared:SSL:30m;
ssl_session_timeout 30m;

# 2048ビット以上で作ったDH交換鍵を指定
ssl_dhparam /etc/ssl/private/dhparam.pem;

# OCSP Staplingを有効にする
ssl_stapling on;
ssl_stapling_verify on;
# ルートCA証明書と中間証明書結合した証明書を指定
<pre>ssl_trusted_certificate /etc/letsencrypt/live/runble1.com/fullchain.pem;

# サーバが示した暗号スイートの優先
ssl_prefer_server_ciphers on;

ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

Diffie-Hellman鍵を作成する。

sudo mkdir /etc/ssl/private
sudo openssl dhparam -out /etc/ssl/private/dhparam.pem 2048

バーチャルホスト側の修正をする。

sudo vim /etc/nginx/conf.d/runble1.com.conf

証明書の変更と、HSTSヘッダーを追加した。

server {
    listen 443 ssl http2;
    server_name runble1.com;

    #ssl_certificate /etc/letsencrypt/live/runble1.com/cert.pem;
    ssl_certificate /etc/letsencrypt/live/runble1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/runble1.com/privkey.pem;

    # HSTS対応
    add_header Strict-Transport-Security "max-age=31536000" always;

構文を確認しておく。

sudo nginx -t

問題なければ再起動。

sudo systemctl restart nginx

再度SSL Labsで評価してもらうとA+となった。

SSL Labのキャッシュを削除しないと評価が変わらないので注意。

SSL設定項目整理

参考サイトを丸ごとコピー参考にしたので、何やってるかぐらいは整理しておこう。

2048ビット以上で作ったDH交換鍵

Forwad Secrecyとは、秘密鍵が漏洩してもそれだけでは解読できないようにする仕組み。

鍵の交換にEDH鍵交換方式を使うことで実現する。

PFS(Perfect Forwad Secrecy)は、上記鍵交換にECDHEまたはDHEを使っている場合にいう。

未来に向けた機密保護機能、という名前がかっこいい。

OCSP

OCSP(Online Certificate Status Protocol)とは、クライアントがサーバに接続する際、サーバ証明書が正当なものか確認するためのプロトコル。
旧来はCRL(証明書失効リスト)が使用されていたが、リストが巨大化してダウンロードに時間かかるようになったため、OSCPが一般的となった。

OSCPは単一のレコードのみ取得するため速い。しかし、OCSP要求をサードパーティのOCSP responderに対して行うためレイテンシと失敗する可能性が加わる。

これを解決するために、クライアント側でOCSP要求をサーバ側で行い、その応答レコードをキャッシュしておく。
TLSハンドシェイク中にキャッシュしていたOCSPレコードをサーバが証明書とともに送信すすることで、HTTPS通信の高速化ができる。
この機能をOCSP Staplingという。

OCSPが機能してるかどうかはopenssl s_clientコマンドで確認できる。

openssl s_client -connect runble1.com:443 -tls1 -status -reconnect 2>&1 < /dev/null | head

OSCPについては、こちらの記事がわかりやすい。

HSTS

HSTSは、クライアントにHTTPSだけでサイトに接続することを伝えるHTTPヘッダ。

This server’s certificate chain is incomplete. Grade capped to B.

SSL Labsで上のような評価が出た。

証明書を指定する部分をcert.pemのままにしてると出るぞ。

server {
    listen 443 ssl http2;
    server_name runble1.com;

    ssl_certificate /etc/letsencrypt/live/runble1.com/cert.pem;
    ssl_certificate_key /etc/letsencrypt/live/runble1.com/privkey.pem;

    # HSTS対応
    add_header Strict-Transport-Security "max-age=31536000" always;

 

参考

無償SSLサーバー証明書Let’s Encryptの普及とHTTP/2および常時SSL化 2ページ

光の速さのWEBサーバー(nginx)をlet’s encryptでSSL化及びHTTP/2化。ついでにセキュリティ評価をA+にする。

nginx連載6回目: nginxの設定、その4 – TLS/SSLの設定

我々はどのようにして安全なHTTPS通信を提供すれば良いか

コメント

タイトルとURLをコピーしました