July 8, 2024 | 03:08
Cloudflare の SSL/TLS を Full (strict) で運用する
これから Web サーバを立ち上げるなら常時SSLにしたいところです。
Let’sencrpt で証明書を自動更新したい場合、Nginx単体だと $ sudo certbot --nginx で完了しますが Cloudflare で常時SSL設定をすると上手くいきません。certbot は http で acme-challenge を行うため origin までリクエストが届かないからです。
このような環境で origin 側の証明書を作成/更新するには2つの方法があります
- 
Cloudflare の Origin Certificates 機能を使用する Cloudflare の SSL/TLS ページ Origin Server タブで origin サーバのための証明書を発行できます。 しかしこの証明書は Cloudflare が発行するオレオレ証明書のため origin サーバに直接アクセスする場合に難があります 
- 
certbot-dns-cloudflare を利用する Cloudflare DNS API を使用して http を利用せずに Let’sencrypt のドメインの認証をします。 origin サーバに直接アクセスできた方が良いので今回は2番目の方法を採用します。 
想定環境
- OS: Ubuntu 19.10 or Ubuntu 20.04
- Web サーバ: Nginx
certbot の導入
最近の Ubuntu だと apt で OK なので便利です。その他の環境の場合は 公式手順を参照してください。
|  |  | 
Cloudflare API token の発行
アカウントの登録やドメインの登録は Cloudflare が指示するフロー通りで大丈夫です。
- Overview ページ右下のAPIのところに Get your API token へのリンクがあります
- Create API Token を押して Edit zone DNS の template を使用して使用するドメインを指定して Create Token を押します。Edit zone DNS 以外の権限は不要です。
~/.secrets/certbot/cloudflare.ini に token を書く
|  |  | 
certbot を叩いて証明書を発行する
|  |  | 
成功すると /etc/letsencrypt/live/ドメイン名/ 以下に証明書が格納されます
Nginx の設定
$ sudo certbot --nginx だと自動的に行ってくれますが今回は certonly (証明書発行のみ)なので自分で行う必要があります。
server {
    # SSL configuration
    #
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    ssl_protocols TLSv1.3 TLSv1.2;
    ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
    # Other configurations
}
自動更新
$ sudo certbot --nginx だとこちらも自動的設定ですが今回は自分で行う必要があります。
/etc/cron.d/ 以下に certbot というファイルを作成して定期的に実行されるようにします。
証明書を更新後に Nginx をリロードしています。
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew && /bin/systemctl reload nginx