今や、総SSL/TLSと呼ばれる時代になり(ほんとか?)、ローカルで何か動かすにも証明書が必要になり、それも自己証明書では動かない事も多々あり、不便なセキュアな時代になりました。
特にDocker周りでもHTTPSとかTLSがデフォルトで要求されるので、回避しようとしても回避できない事態が発生しています。
そこで、「ローカルで使えるワイルドカードの証明書があればいいんだよ。」と作ってみた話になります。
あちこちに解説がありますが、certbotのコマンドが微妙に違っていたり、APIトークンの発行方法が違っていたりしたので、自分向けの完全版として記録しておきたいと思います。
1. はじめに
以下のような順番で作業をします。
- Cloudflareのアカウントを作ります。Freeで構いません
- Cloudflareでドメインを取得します。お金が掛かります
- Linuxサーバーを立ち上げます。WSL2とかで構いません
- Linuxサーバーにcertbotとcertbot-dns-cloudflareプラグインをインストールします
- CloudflareでAPIトークンを発行します
- APIトークンをiniファイルに保存します
- certbotコマンドで証明書を発行します
本作業では、ACME DNS Challengeという方法でドメインの認証を行います。
一般的にLet's Encryptはドメインの所有者を確認するのにTLS証明書を利用するサーバーへ接続し、HTTP接続できたらTLS証明書を発行するという流れになりますが、プライベートにあるサーバーはHTTP接続できません。
そこで、DNSサーバーのTXTレコードにチャレンジ用の文字列を書き込むことでドメインの認証を行います。
certbotには、上記のドメインの認証を行う為にDNSサーバー(のサービス)を書き換えるための機構が備わっています。しかし、DNSサーバーのサービスを様々なプロバイダーが提供しており、接続方法や認証方法、書き換える方法が違うのでプラグインという形でそれぞれのプロバイダーにあったプラグインをインストールする必要があります。
Certbot Instructions | Certbot
https://certbot.eff.org/instructions?ws=nginx&os=snap&tab=wildcard
2. Cloudflareのアカウントを作ります
作るのは簡単です。以下のURLからメールアドレスとパスワードを入れて「サインナップ」をクリックするとアカウントが作製されます。Freeを選択すれば無料で開始できます。
プランは、Freeを選択しておきましょう。
3. Cloudflareでドメインを取得します。
「ドメインの管理」>「ドメインの登録」で取得したいドメイン名を入れてドメインを購入します。
クレカ払いかPaypalで支払いできます。継続にするかどうかはお任せします。
トップドメインがusだと6.5ドルぐらいなのでそれで十分です。
4. Linuxサーバーを立ち上げます
certbotを動かす為にLinuxが必要です。Windowsで動かすWSL2とかで構いません。
今時だとUbuntuとかかなと思います。
5. Linuxサーバーにcertbotとcertbot-dns-cloudflareプラグインをインストールします
以下の記事に沿って、certbotとプラグインをインストールします。
https://certbot.eff.org/instructions?ws=nginx&os=snap&tab=wildcard
Webサーバーは正直なんでもいいので、Apacheとかnginxを選択しておけばOKです。
5.1 certbotをインストール
以下のコマンド(Ubuntu向け)でインストールします。
sudo snap install --classic certbot
記事では、certbotを/usr/bin/certbotにシンボリックリンクしています。
必要?って思いますが、cronで実行したりするときにパスが違ったりすると動かないかもしれないので、実行しておきましょう。
sudo ln -s /snap/bin/certbot /usr/bin/certbot
あと、よく分からないのですが、snapでインストールすると書き込む領域が限られる(からかどうかは分からないが)ので、以下のコマンドを実行しておきます。rootでプラグイン実行を許可する?みたいなオプションでしょうか。
sudo snap set certbot trust-plugin-with-root=ok
5.2 certbot-dns-cloudflareプラグインをインストール
CloudflareのDNSを書き換える用のプラグインをインストールします。
sudo snap install certbot-dns-cloudflare
6. CloudflareでAPIトークンを発行します
ものの記事には、「Global API Keyを使う」とか書かれていますが、Global APIキーはあまりにも権力が強大すぎるので漏れたときの影響が甚大です。そうではなくて、DNSの書き換えだけに特化したAPIキーを作成して、これを利用するようにしましょう。
APIトークンの発行画面は、プロフィールページの「APIトークン」から発行できます。
API トークン | Cloudflare
https://dash.cloudflare.com/profile/api-tokens
右の「トークンを作成する」ボタンを押します。
下記の「ゾーンDNSを書き換える」の「テンプレートを使用する」が楽なので、これをクリックします。
「アクセス許可」は「ゾーン」の「DNS」の「編集」になっているので変更不要です。
ゾーンリソースの一番右側で自分の書き換えたいドメインだけ選択します。
以下の「クライアント IP アドレスフィルタリング」と「TTL」は指定した方がベターですが、今回は指定しないでおきます。
「DNS:編集」になっているのを確認します。
次のページでトークンが発行されるので、curlコマンドのテストを使ってテストしておきましょう。
うまくいったら、トークンはどこか安全な場所に保管しておきます。
7. APIトークンをiniファイルに保存します
/rootディレクトリに.cloudflareというディレクトリを作って、
CloudflareのAPIトークンCredentialファイル
を作ります。
mkdir ~root/cloudflare/
chmod 700 ~root/cloudflare/
7.1 CloudflareのAPIトークンCredentialファイルを作る
echo 'dns_cloudflare_api_token = <APIトークンを入れる>' > cloudflare.ini
chmod 600 /root/.cloudflare/cloudflare.ini
8. certbotコマンドで証明書を発行します
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /root/.cloudflare/cloudflare.ini \
--dns-cloudflare-propagation-seconds 60 \
--server https://acme-v02.api.letsencrypt.org/directory \
-d <取得したドメイン> \
-d *.<取得したドメイン> \
-m <メールアドレス> \
-n
オプションで、ACME利用規約に同意を付けても良い
--agree-tos
8.1 1回ドライランしておく
以下のコマンドでDry-runできる。
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /root/.cloudflare/cloudflare.ini \
--dns-cloudflare-propagation-seconds 60 \
--server https://acme-v02.api.letsencrypt.org/directory \
-d <取得したドメイン> \
-d *.<取得したドメイン> \
-m <メールアドレス> \
-n \
--agree-tos
9. certbotを実行する
実行すると自動的にCloudflare DNSに以下のようなエントリーが登録されます。
DNS認証が終了したら自動的に削除されます。
/etc/letsencrypt/live/
配下に証明書が保存されます。
作られた証明書は、ワイルドカード証明書なのでホスト名が違っていても利用できます。
ls -la /etc/letsencrypt/live/**/*
10. まとめ
Let's EncryptとCloudflareで簡単に取得できるいい時代になりました。
11. 参考
CloudflareのDNSを使ってCertbotで証明書を発行する | minetaro12
https://0sn.net/posts/20220217/cloudflaredns-certbot/
LAN 内の開発用 Ubuntu に Let's Encrypt の無料 SSL 証明書をインストール | Peddals Blog
https://blog.peddals.com/lets-encrypt-for-apache-dev-site-on-ubuntu/
Proxmox WebUIからCloudflare DNS API経由でSSL証明書を取得できるようにする #Let’sEncrypt - Qiita
https://qiita.com/katori_m/items/20ec2773000a89103774