Let’s EncryptでSANs対応のドメイン認証をとる

2016年10月1日

このサイトはFujiSSLでドメイン認証をとりましたが、費用を掛けないのであればLet’s Encryptを利用する方法もあります。というかサーバーに同居している他のサイトはLet’s Encryptで認証していました。(今はFujiSSLに切り替わっています)

参考にしたのはLet’s EncryptのSSL証明書で、安全なウェブサイトを公開|さくらのナレッジ



certbotをインストールしてSSL証明書を発行

FreeBSD用にはpkgでバイナリpackageが用意されているので、これをインストールします。

root:~ # pkg install py27-certbot

実行ファイルはcertbot。certonlyコマンドを使って、-wに続けて対象ディレクトリと-dに続けてドメイン名を指定します。メールアドレスを訊かれたあとライセンス内容を承諾すると、SSL証明書が発行されます。

root:~ # certbot certonly --webroot -w /usr/local/www/sample/ -d www.example.com -d example.com

ドメイン名は複数回指定することでSANs対応の証明書を発行することができます。無事SSL証明書が発行されると、/usr/local/etc/letsencrypt/live/www.example.com/の下に証明書ファイルが生成されます。

nginxの設定

443番のhttpsポートに対してssl_certificateとssl_certificate_keyをそれぞれ設定します。それからhttp接続されたリクエストをhttpsにリダイレクトさせるため、80番のhttpポートに対してreturn 301を設定します。

server {
    listen       80;
    server_name  .example.com;
    return       301 https://www.example.com$request_uri;
}
server {
    listen       443 ssl;
    server_name  example.com;
    ssl_certificate        /usr/local/etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key    /usr/local/etc/letsencrypt/live/www.example.com/privkey.pem;
    return       301 https://www.example.com$request_uri;
}
server {
    listen       443 ssl;
    server_name  www.example.com;
    ssl_certificate        /usr/local/etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key    /usr/local/etc/letsencrypt/live/www.example.com/privkey.pem;
    location / {
        root   /usr/local/www/sample;
        index  index.html index.htm;
    }
}

最後にcrontabに証明書の更新設定を入れておきます。

0    0    25    *    *    root    /usr/local/bin/certbot renew

証明書の有効期限が3ヶ月しかないので、毎月決まった日に更新をかければ、万が一更新をミスっても翌月にリカバーできますね。