Let's EncryptでSSL対応した話(raspbian+nginx)

Let’s EncriptでSSL対応したときの話です。嬉しいことについ最近(2018年3月)にワイルドカード証明書が発行できるようになったようです。これでバーチャルホスト増やす度に証明書発行しなおすなんてことをしなくて済むぞヤッタネ。

手順

raspbian+nginxでの手順です。

cd /usr/local/src
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
bash

ここでexample.comと*.example.comの両方を登録するところが肝です。僕はexample.comの方を追加し忘れて再発行する羽目になりました。

sudo ./certbot-auto --manual certonly -d example.com -d *.example.com --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory -m [email protected] --agree-tos

色々聞かれますが、途中でDNSでTXTレコードを設定しろと言われます。設定して

dig _acme-challenge.example.com txt

でTXTレコードが反映されているか確認します。結構待たされました。次にnginxのconfを弄っていきます。

cd /etc/nginx/sites-available
sudo vim example.com.conf

例えばこんな感じです。

server {
        listen 80;
        server_name _;
        return 301 https://$host$request_uri;
}

server {
        listen 443 default_server;
        server_name example.com www.example.com;

        ssl on;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

        root /var/www/html;
        index index.html index.htm;

        location / {
                try_files $uri $uri/ =404;
        }
}

sites-enabled内にシンボリックリンクを貼って、nginxを再起動します。

cd /etc/nginx/sites-enabled
sudo ln -s /etc/nginx/sites-available/example.com.conf example.com.conf
sudo nginx -t
sudo nginx -s reload

証明書の自動更新にはここではCloudflareを使います。certbotのCloudflare向けプラグインが用意されているからです。まずはCloudflareに自分のドメインを登録します。以下手順です。

  1. Cloudflareにサインアップする。
  2. 指示に従ってドメインを入力する。
  3. Cloudflareのネームサーバーが提示されるので(お名前ドットコム等で設定した)ネームサーバーから提示されたものに変更する。
  4. Cloudflareで「Status: Active」になっていることを確認する。
  5. Global API Keyを控える。

CloudflareのAPIキーを記したiniファイルを用意します。控えておいたAPIキーを入力します。

vim /etc/letscrypt/cloudflare.ini

以下の書式です。

dns_cloudflare_email = [email protected]
dns_cloudflare_api_key = hogefuga

iniファイルのパーミッションを変えておきます。

sudo chmod 600 /etc/letscrypt/cloudflare.ini 

certbotのCloudflare向けプラグインを有効にします。

cd /usr/local/src/letsencrypt/certbot-dns-cloudflare
sudo python setup.py install

有効になったか確認します。

certbot plugins

以下のようにCloudflareのプラグインが有効になっていることが確認できればOKです。

* dns-cloudflare
Description: Obtain certificates using a DNS TXT record (if you are using
Cloudflare for DNS).
Interfaces: IAuthenticator, IPlugin
Entry point: dns-cloudflare =
certbot_dns_cloudflare.dns_cloudflare:Authenticator

証明書の更新をテストします。

sudo certbot renew --dry-run --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini

以下のように表示されれば更新のテストは成功です。

-------------------------------------------------------------------------------
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/example.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
-------------------------------------------------------------------------------

毎月1日の朝5時に証明書を更新するようにします。(–dry-runオプションを取ること)

sudo crontab -e

以下を追記します。

00 05 01 * * /usr/local/bin/certbot renew --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini; systemctl restart nginx

以上です。

参考