Let’s Encrypt+Gehirn DNSでのdns-01チャレンジとHAProxy連携

今更ながら、ワイルドカード証明書が無料ってすごい時代ですね。

 弊ドメインはマネージドなDNSサービスとしてGehirn DNSを利用しております。

https://www.gehirn.jp/dns/plan/

 安価にAPIなどで操作可能なマネージドDNSが利用できるので非常に便利です。

 また、証明書は無料のLet’s Encryptを利用しております。(超弱小自己満個人サイトのため、これで十分です。)

 今まで、VPSにおいてはin-deep.blueのみの証明書を用いていましたが、先日のVPS事業者移行よりHAProxyを導入し、自宅を含めたサーバ系ネットワークの構成を変更しました。

 それにより、サブドメイン運用の各種サーバ(Mastodon sv1.in-deep.blue等)もHAProxyで通信の振り分けを行いたく思い、今回ワイルドカード証明書を取得することとしました。

 Let’s Encryptでのワイルドカード証明書の取得については、基本的にCertbotの公式手順に従えばOKですが、使用するソフトウエアを選択させるくせに設定すべき内容がちゃんと出てこないため、ちょっと微妙でした。(整備しきれないなら選択肢作らずOthersの内容だけでいいんじゃないの、と。。。)

 Let’s Encryptにてワイルドカード証明書を取得するには、dns-01チャレンジを行う必要があります。

 さて、先述したCertbotですが、プラグインでGehirn DNSの操作に対応しています。

https://eff-certbot.readthedocs.io/en/stable/using.html#dns-plugins

 これにより、非常に簡単にワイルドカード証明書が取得できます。

 設定方法は、Wikiにある通りGehirn DNS操作可能な権限を与えたAPI静的トークンを適宜セキュアに別ファイルへ保存し、--dns-gehirnオプションの指定と、--dns-gehirn-credentialsオプションにパスを渡すだけです。

 あとは、以下の通りコマンド実行で、dns-01認証が可能なはずです。(ログとってなかった。かなしい。)

# certbot certonly --dns-gehirn --dns-gehirn-credentials <クレデンシャル情報ファイルパス> -d *.in-deep.blue -d in-deep.blue -m <めーるあどれす>

 発行された証明書は /etc/letsencrypt/live/in-deep.blue/ 配下に、最新版へのシンボリックリンクが作成されます。

# ls /etc/letsencrypt/live/in-deep.blue/
README  cert.pem  chain.pem  fullchain.pem  privkey.pem

 さて、証明書は無事発行できましたが、これをHAProxyへ食わせるためには更にひと手間必要です。

It designates a PEM file containing both the required certificates and any associated private keys. This file can be built by concatenating multiple PEM files into one (e.g. cat cert.pem key.pem > combined.pem). If your CA requires an intermediate certificate, this can also be concatenated into this file. Intermediate certificate can also be shared in a directory via “issuers-chain-path” directive.

If the file does not contain a private key, HAProxy will try to load the key at the same path suffixed by a “.key”.

https://docs.haproxy.org/2.2/configuration.html#5.1

・・・とのことで、pemファイルにPrivate keyを書くか、「pemファイルと同名.key」を読みますってことになっています。

 そして、この操作をLet’s Encryptの自動更新が実施されるたびに行う必要があります。面倒ですよね。自動化しましょう。

 https://qiita.com/kazuhidet/items/9d58a104f93d9ff7302d

 というとで、/etc/letsencrypt/renewal-hooks/deploy/配下に、スクリプトを入れておけば良さそうです。

 ぼくはアホなので、「ばなな(画像略)」みたいなスクリプトを作成し、入れておきました。

#!/bin/bash

cat /etc/letsencrypt/live/in-deep.blue/fullchain.pem /etc/letsencrypt/live/in-deep.blue/privkey.pem >  /etc/haproxy/in-deep.blue.pem

systemctl reload haproxy

 これでうまく動作していそうです。やったぜ。

 Mastodonサーバなどのバックエンドサーバ群に設定する証明書等、また色々別の設定は必要ですが、そちらはよしなに。(VPS-自宅サーバNWをVPNで接続しているので、暗号化的な意味ではほぼ不要なのですが、ALPN対応等のためにTLS化しておくのはありだと思います。)

以上、備忘録でした。