Let's Encrypt + Nginx の導入

Posted over 1 year ago by yoosee.
  ssl nginx security letsencrypt

Update: この記事中のやり方は古くなっているので2017年7月現在は以下の記事を参考。 Let’s encrypt の証明書を certbot を使って更新する - W3er

このブログをSSL化するにあたって Let’s Encrypt - Free SSL/TLS Certificates の証明書を導入しているのでその備忘録。Let’s Encrypt は最近のブラウザであれば標準で利用できる証明書(ドメイン認証:DV)を無料で発行してくれる。現在 Public Beta の状態だが、登録すれば誰でも利用が可能だし、Valid な Cert が提供されている。

SSL in blog.yoosee.net

登録後に必要なツールを持ってきてセットアップする。下記を実施したのは 2016-03-09 だが、去年12月にやった時と少しやり方が変わっている気がするので、実施時にはドキュメントや –help などを見てやったほうがいいかもしれない。

% git clone https://github.com/letsencrypt/letsencrypt
% cd letsencrypt
% ./letsencrypt-auto 

Debianであれば必要なパッケージがインストールされる(当然内部で sudo が求められている)。libssl-dev などが入るので予め apt で入れておくといいかも。letsencrypt 自体は何も指定しなければ ~/.local の下にインストールされるようだ。

SSL Cert の作成は、Apache であれば設定ファイルの変更まで勝手にやってくれるらしいが、Nginx 対応はまだのようなので certonly --standalone オプションで Cert の作成のみを行う。

% sudo ~/.local/share/letsencrypt/bin/letsencrypt certonly --standalone -d blog.yoosee.net
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/blog.yoosee.net/fullchain.pem. Your cert will
expire on 2016-06-07. To obtain a new version of the certificate in
the future, simply run Let's Encrypt again.
- If like Let's Encrypt, please consider supporting our work by:

上記の通り、中間証明書を merge した fullchain が /etc/letsencrypt/live/blog.yoosee.net/fullchain.pem に生成される。有効期限は生成日より約3ヶ月といささか短いので、Let’s Encrypt でも cron などで更新を自動化することを推奨している。例えば下記のような cron を仕込んでおくと /etc/letsencrypt/live/blog.yoosee.net.conf に自動生成されている設定ファイルに従って renew をかけてくれるようだ。

0 4 1 * * /home/yoosee/.local/share/letsencrypt/bin/letsencrypt renew

Nginx の SSL 関係の設定はこんな感じ。上記コマンドは Certificate Key も /etc/letsencrypt/live/blog.yoosee.net/privkey.pem に作っているのでそれを指定する。

server {
        listen 443; # listen for ipv4
        server_name blog.yoosee.net;
#...
        ssl on;
        ssl_certificate /etc/letsencrypt/live/blog.yoosee.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/blog.yoosee.net/privkey.pem;
        ssl_session_timeout 10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;
#...
}

上記ではついでに Diffie-Hellman key exchange のパラメータも作成して指定している。これをやっておかないと Key Exchange の強度で Cipher DHE 関連で微妙にディスられたのだが、ちゃんと設定すると SSL Server Test: blog.yoosee.net (Powered by Qualys SSL Labs) でも今のところ A 判定をもらっている。

% sudo openssl dhparam 2048 -out /etc/nginx/ssl/dhparam.pem

過去に仕事でやった商用Certの導入や更新に比べたらものすごく簡単で素晴らしいことである。