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+にする。
コメント