【CentOS / Nginx】Let’s Encrypt で SSL/TLS証明書 を発行してみた

Let’s Encrypt が 2015-12-03より Public Beta になったので, 自分が趣味で運用しているWebサービス (CentOS 6.6 / Nginx 1.0.15) で試してみたのでメモ。

Let’s Encryptで SSL/TLS証明書を発行する

Closed Betaの時は, Let’s Encrypt Closed Beta Invite にドメインとメールアドレスを登録して, 承認メールが来るのを待っていたが, Public Betaでは./letsencrypt-auto 実行時に聞かれるので, この事前申請は必要なくなっている。

証明書の発行方法は Let’s Encrypt 総合ポータル を参考にして問題なく発行できた。

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt/
$ ./letsencrypt-auto --server https://acme-v01.api.letsencrypt.org/directory --help 

Nginx と uWSGIサーバー上で動かしている Webアプリケーションを停止させる。停止方法は適当。

$ ps aux | grep uwsgi
$ kill {PID}
$ service nginx stop
$ service nginx status

証明書を発行する。成功すると /etc/letsencrypt/live/{your-domain}/ 以下に証明書へのシンボリックリンクが張られる。

$ ./letsencrypt-auto certonly -a standalone -d {your-domain} --server https://acme-v01.api.letsencrypt.org/directory
$ cd /etc/letsencrypt/live/{your-domain}/
$ ls
cert.pem@  chain.pem@  fullchain.pem@  privkey.pem@

Nginx設定変更

Nginxの設定を 80 port へのアクセスの場合 443 port へ 301リダイレクト するように変更する。

$ vim /etc/nginx/nginx.conf
server {
            listen 80;
            server_name {your-domain};
            return 301 https://$host$request_uri;
}

server {
            listen 443 ssl;
            ssl on;
            ssl_certificate /etc/letsencrypt/live/{your-domain}/cert.pem;
            ssl_certificate_key /etc/letsencrypt/live/{your-domain}/privkey.pem;

            ...
}

Nginxを起動する。

$ service nginx start

Chromeから https://{your-domain}/ に正常にアクセスでき, Chromeのデベロッパーツールから Security > Overview > view Certificate > サブジェクト > CN (Common Name, 通称) が ドメイン名 と一致していれば取り敢えずは問題ないと思われる。

ただ, Webアプリケーションで ractive.js を使っており CDNからリソースを取得しているのだけど cdn.ractivejs.org が無効な証明書なので読み込めないと言われたので, ractive.min.js は自分のドメインに配置するようにした。

手動更新

証明書の有効期限が 90日間 なので忘れずに更新しないといけない。証明書の有効期限の確認は openssl コマンドでできる。

$ openssl x509 -in /etc/letsencrypt/live/{your-domain}/cert.pem -noout -dates
notBefore=Apr 30 14:43:00 2016 GMT
notAfter=Jul 29 14:43:00 2016 GMT

手動更新の場合, letsencrypt-auto renew でできる。

$ service nginx stop
$ ./letsencrypt-auto renew
$ service nginx start

crontab で対話モードでない設定として自動更新 [1]もできるようだ。

また, iOSの Mobile Safariからアクセスすると, “信頼されていません” という確認画面が出たが なんちゃってWebサービス なので現状, 気にしていない。

より技術的な仕組みの話は Let’s Encrypt を支える ACME プロトコルが勉強になる。


[1] Let’s Encrypt サーバー証明書の取得と自動更新設定メモ
[2] Let’s EncryptのSSL証明書で、安全なウェブサイトを公開