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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です