Ubuntu16 + Nginx + Let’s Encrypt で SSL Server Test A+ にしてみる
やりたいことはタイトルの通りです。
(SSL Server TestやLet’s Encryptの変化が激しいので、あくまでも2017/4/11現在で確認した手順と捉えていただければ幸いです…)
環境
サーバー
Ubuntu 16.04.2 LTS
手順
nginxインストール
$ sudo apt-get update $ sudo apt-get install nginx -y
nginx設定
$ sudo vi /etc/nginx/sites-available/ssl server { listen 443 ssl http2; root /var/www/ssl; index index.html; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_dhparam dhparam.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers AESGCM:HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;'; location / { try_files $uri $uri/ =404; } } $ sudo ln -s /etc/nginx/sites-available/ssl /etc/nginx/sites-enabled/ssl $ sudo openssl dhparam -out dhparam.pem 2048 $ sudo mkdir -p /var/www/ssl $ echo "test page" | sudo tee /var/www/ssl/index.html
Let’s Encrypt パッケージインストール
ubuntu16はcertbotパッケージが存在するのでそのまま使います。
他の環境については下記ページを参照してください。
Certbot クライアントのインストール – Let’s Encrypt 総合ポータル
$ sudo apt-get install letsencrypt -y
SSL証明書の取得
大きく分けて「standalone」と「webroot」というふたつの取得方法があるようです。
standaloneは80と443のポートをバインドするため、nginxやapacheが80や443のポートでListenしていると途中で失敗します。そのため証明書の発行時にはWebサーバーを停止する必要があります。
Webサーバーを停止せずに証明書を発行するにはwebrootプラグインというものを使用すれば良いみたいです。
ただ、証明書がないから証明書発行したいのに、証明書を設定しておかないと443でサーバーを起動できないというジレンマが発生するため、先にstandaloneで発行してからwebrootで取得し直すことにします。
初回(standalone)
$ sudo service nginx stop $ sudo letsencrypt certonly --standalone -d example.com メールアドレス入力 $ sudo service nginx start
更新(webroot)
$ sudo letsencrypt certonly --webroot /var/www/ssl -d example.com 証明書を更新するかどうか聞かれるので「Rebew & Replace 〜」的な方を選択 $ sudo ls -l /etc/letsencrypt/live/example.com total 0 lrwxrwxrwx 1 root root 37 Apr 11 02:19 cert.pem -> ../../archive/example.com/cert2.pem lrwxrwxrwx 1 root root 38 Apr 11 02:19 chain.pem -> ../../archive/example.com/chain2.pem lrwxrwxrwx 1 root root 42 Apr 11 02:19 fullchain.pem -> ../../archive/example.com/fullchain2.pem lrwxrwxrwx 1 root root 40 Apr 11 02:19 privkey.pem -> ../../archive/example.com/privkey2.pem $ sudo service nginx reload
確認
緑マークでhttp2も有効になってます。
A+になっていました。
自動更新
cronで自動更新されるようにしておきます。
証明書の期間が90日なので、週次くらいで「renew」をかけるとか月次で「renew –force-renew」かけるとかでしょうか。
$ crontab -e 00 4 * * 7 sudo letsencrypt renew && sudo service nginx reload