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 hoge@example.com --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に自分のドメインを登録します。以下手順です。
- Cloudflareにサインアップする。
- 指示に従ってドメインを入力する。
- Cloudflareのネームサーバーが提示されるので(お名前ドットコム等で設定した)ネームサーバーから提示されたものに変更する。
- Cloudflareで「Status: Active」になっていることを確認する。
- Global API Keyを控える。
CloudflareのAPIキーを記したiniファイルを用意します。控えておいたAPIキーを入力します。
vim /etc/letscrypt/cloudflare.ini
以下の書式です。
dns_cloudflare_email = your@email.address 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
以上です。