Let's Encryptを導入し、nginxをTLSおよびHTTP/2化する
目次
今回の目的
- Webサーバ(nginx)のHTTPSおよびHTTP/2化
- Let’s Encryptの証明書自動更新
作業環境
さくらのVPS 1G
CentOS release 6.8 (Final)
nginx 1.9.5以上
新しいバージョンのnginxを導入
nginxをhttp/2化する際、1.9.5以上のバージョンを要求されます。
作業時点のyumリポジトリでは、stable versionとして1.8.2が公開されていたので、
mainline versionからより新しいバージョンを取得します。
リポジトリの編集
$ sudo vim /etc/yum.repo.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/mainline/rhel/$releasever/$basearch/ # この行を変更 gpgcheck=0 enabled=1
nginxのアップデート
アップデート前にnginxを停止し、yum updateを実行します。
$ sudo yum service nginx stop Stopping nginx: [ OK ] $ sudo yum update nginx
バージョンの確認とnginx起動
特に問題が無ければmainline版のnginxがインストールされているので、
バージョン確認の後にnginxを起動しましょう。
$ nginx -v nginx version: nginx/1.9.15 $ sudo service nginx start Starting nginx: [ OK ]
Let's Encryptセットアップ
Let's Encryptのインストール
Let's Encryptのファイル自体はGitHubにて公開されているので、
任意のディレクトリに移動してgit cloneを行います。
今回は /usr/local にて作業を行いました。
$ git clone https://github.com/letsencrypt/letsencrypt
git cloneが完了したら"letsencrypt"ディレクトリに移動し、
パッケージインストールのコマンドを実行します。
$ cd letsencrypt/ $ ./letsencrypt-auto --help
Let's Encryptのクライアントを実行し、証明書取得
Let's Encryptでは証明書取得の手段が複数用意されていますが、
今回はwebrootプラグインを利用して更新を行います。
$ ./letsencrypt-auto certonly --webroot --webroot-path /var/www/html -d y4shiro.net
途中でメールアドレス入力と利用規約への同意を求められるので、適宜入力していきます。
証明書取得が完了すると、下記のようなファイルが作成されます。
$ sudo tree /etc/letsencrypt /etc/letsencrypt ├── accounts │ └── acme-v01.api.letsencrypt.org │ └── directory │ └── ******** │ ├── meta.json │ ├── private_key.json │ └── regr.json ├── archive │ └── y4shiro.net │ ├── cert1.pem │ ├── chain1.pem │ ├── fullchain1.pem │ ├── privkey1.pem ├── csr │ ├── 0000_csr-certbot.pem ├── keys │ ├── 0000_key-certbot.pem ├── live │ └── y4shiro.net │ ├── cert.pem -> ../../archive/y4shiro.net/cert1.pem │ ├── chain.pem -> ../../archive/y4shiro.net/chain1.pem │ ├── fullchain.pem -> ../../archive/y4shiro.net/fullchain1.pem │ └── privkey.pem -> ../../archive/y4shiro.net/privkey1.pem └── renewal └── y4shiro.net.conf
/etc/letsencrypt/live/y4shiro.net に証明書が発行されます。
証明書自動取得
Let's Encryptで発行される証明書は期限が90日と短いので、 自動更新を行うよう設定します。
Crontabにて "毎月1日 00:00" の更新とnginxのreloadを設定しました。
$ sudo crontab -e 00 00 01 * * /usr/local/letsencrypt/letsencrypt-auto certonly --renew-by-default --webroot -w /var/www/html -d y4shiro.net && service nginx reload
nginxの設定
発行した証明書をnginxで読み込み、HTTPSとHTTP/2化を行うためにConfigファイルを編集しましょう。
HTTPSではポート443を使用するので、事前にiptableで開放しています。
Configファイル編集
qiita.com
上記記事を参考に、Configファイルの編集を行いました。
SSLv3.0に脆弱性が発見されているので、"ssl_protocols"、"ssl_ciphers"に関しては必ず設定を行って下さい。
"ssl_dhparam"(Perfect Forward Security)に関してはお好みで。
# redirect to 443 server { listen 80; server_name y4shiro.net; rewrite ^ https://$server_name$request_uri? permanent; } # server setting server { listen 443 ssl http2; server_name y4shiro.net; access_log /var/log/nginx/y4shiro.net/access.log main; error_log /var/log/nginx/y4shiro.net/error.log; ssl_certificate /etc/letsencrypt/live/y4shiro.net/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/y4shiro.net/privkey.pem; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_session_tickets on; ssl_dhparam /etc/ssl/private/dhparam.pem ssl on; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers AESGCM:HIGH:!aNULL:!MD5; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/y4shiro.net/fullchain.pem; resolver 8.8.8.8; add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;'; client_max_body_size 10M; location / { root /var/www/html; index index.html index.htm; } }
https化の確認
nginxの再起動およびリロードを行ったのち、
Webページにアクセスしてhttps化されていることを確認してください。
以上です。
参考文献
Let's Encryptの証明書をnginxに設定してhttps化した | tsuchikazu blog 光の速さのWEBサーバー(nginx)をlet's encryptでSSL化及びHTTP/2化。ついでにセキュリティ評価をA+にする。 - Qiita