nginxがHTTP2対応し出したため、早速対応させつつ、昨今のSSL関連セキュリティ事情の設定を見直し、SSLv3の対応を切ったり、暗号化スイートの設定を最適化させたりといったことを行っていたところ、なかなかどうして上手く動いてくれない状態が続いてしまっていました。
で、ようやく動いたこともあってメモ代わりにと。
現在、このブログをはじめ、anoncom.netドメインやその他いくつかの開発・管理サイトは1台の同一VPS環境上で稼働させており、全てnginxで稼働しています。
そのため、全てのドメイン上でそれぞれSSL関連の記述を書くと、それぞれでまた長くなるため、共通化出来るものについては1つにまとめ、includeで読み込むようにしています。
必要があればその時はincludeせずそれぞれのサイトで個別に記述すればいいし。
そんなわけで、各サイトは基本的に下記の様に設定しています。設定は全てnginx用です。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
server { | |
listen 443 ssl http2; | |
server_name example.com; | |
error_log /var/log/nginx/error.log; | |
access_log /var/log/nginx/access.log main; | |
root /var/www/example.com/public; | |
index index.html; | |
ssl on; | |
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; | |
#ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; | |
# See also about following includes https://gist.github.com/anon5r/d3e2de229049a281ebaf | |
include ssl_common.conf; | |
add_header Content-Security-Policy upgrade-insecure-requests; | |
# gzip settings | |
gzip on; | |
gzip_min_length 1100; | |
gzip_buffers 4 8k; | |
gzip_types text/plain text/xml text/css text/javascript application/x-javascript image/png image/jpeg image/gif; | |
gzip_disable "msie6"; | |
gzip_vary on; | |
output_buffers 1 32k; | |
if_modified_since before; | |
client_header_buffer_size 2k; | |
large_client_header_buffers 4 8k; | |
location / { | |
allow all; | |
try_files $uri $uri/ /index.php?$args; | |
} | |
location /favion.ico { | |
log_not_found off; | |
} | |
} | |
server { | |
listen 80; | |
server_name www.example.com; | |
return 301 https://example.com$request_uri; | |
} | |
server { | |
listen 80; | |
server_name example.com; | |
return 301 https://example.com$request_uri; | |
} |
また、SSLで共通化出来る部分については ssl_common.conf という感じのファイルに記述し、これを各サイトの server{~}内で includeさせています。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ssl_session_cache shared:SSL:10m; | |
ssl_session_timeout 10m; | |
ssl_dhparam dhparam.pem; | |
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; | |
add_header X-Frame-Options DENY; | |
add_header X-Content-Type-Options nosniff; | |
add_header Cache-Control "public, must-revalidate"; | |
## TLS Session Tickets setting | |
ssl_session_tickets off; # Requires nginx >= 1.5.9 | |
ssl_session_ticket_key ssl_session_ticket.key; | |
## Support for OCSP Stapling | |
#ssl_stapling on; # Requires nginx >= 1.3.7 | |
#ssl_stapling_verify on; # Requires nginx => 1.3.7 | |
#resolver 8.8.8.8 8.8.4.4 valid=300s; | |
#resolver_timeout 5s; | |
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; | |
ssl_prefer_server_ciphers on; | |
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4; |
ここまでの設定の通り、HTTP2対応するにも、SSL(というかTLS)が必要で、そうなると必然的にSSL証明書の準備をしなければなりません。
メインドメインの anoncom.net については先日キャンペーンを行っていたさくらのSSLでRapidSSLを購入して設定しました。
その他のドメインについては、無料で1年間使えるで有名なStartSSLや、以前に最大3年間、100ドメイン分無料で取得出来ると紹介されていた WoSign Free SSLを使ったりをしていました。
またつい最近ではLet's Encryptもようやくはじまり、一部(というか上記で取得しなかった残り分)はそちらを使ったりとして、何だかんだほとんどのページをHTTP2に対応させました。
それぞれの作成方法や設定方法などは既に他のブログなどで紹介されてるのでここでは割愛。
とまぁそんな感じでようやくにしてサイトをHTTP2に対応させることが出来ました。