Cloudflareで証明書の自動更新が上手くいかなかった話

1ヶ月振りの投稿はこのブログをホストしているサーバ周りのお話です。

今年の2月にこのドメインをCloudflareというCDNに登録してから、どういうわけか別のサブドメインで管理しているGitのリモートリポジトリだけ証明書の更新に失敗する事象に見舞われていました。

このサーバはAPを全部Dockerでホストしていて、リバースプロキシ側でサブドメインに応じて接続先コンテナを振り分けるのと同時にSSL化する機構を噛ませているのですが、ブログの方は問題なく更新できる(どのみちCDNの証明書使ってるけど)のに何故だろう……と色々調査していました。

超絶ざっくりコンテナアーキテクチャ

証明書はLet’s Encryptで生成しているため、何もしなければ3ヶ月で期限切れを起こしてしまいます。前回(5月)に同じ事象が発生したときは一度証明書を消して再取得したら上手くいったのですが、昨日また同じことが起こってしまいました。

ウカウカしていると同じことが起こったときまたハマりそうだったので備忘録することにしました。

TL;DR

該当サブドメインのDNSのAAAAレコードを削除することで解決しました。

CloudflareのDNS設定

Why?

ブログのサブドメインはCDNによりProxy化していました。一方でGit側はDNS設定のみを返すようにしていました。これが「ブログで起こらないのにGitで起こる」のそもそもの理由のように思います。

なぜそのようにしていたかというと、これはCloudflareの制約で、Proxy化できるポートが制限されており、GitのSSH認証に必要なポートを開けられなかったからです。

で、AAAAレコードを登録しておくと証明書の更新ができない理由ですが、これはLet’s Encryptの force_renew コマンドを叩いたときの出力にモロに吐かれていました。

$ docker exec -it letsencrypt-nginx /bin/bash
bash-5.0# ./force_renew

CA marked some of the authorizations as invalid, which likely means it could not access http://example.com/.well-known/acme-challenge/X. Did you set correct path in -d example.com:path or –default_root? Are all your domains accessible from the internet? Please check your domains’ DNS entries, your host’s network/firewall setup and your webserver config. If a domain’s DNS entry has both A and AAAA fields set up, some CAs such as Let’s Encrypt will perform the challenge validation over IPv6. If your DNS provider does not answer correctly to CAA records request, Let’s Encrypt won’t issue a certificate for your domain (see https://letsencrypt.org/docs/caa/). Failing authorizations: https://acme-v02.api.letsencrypt.org/acme/authz-v3/**********

……ということでサーバ側のゲートウェイがIPv6に対応しておらず(もしくはIPv6向けのポートフォワード設定をしらおらず)名前解決に毎回失敗していたのではなかろうか、というのが今のところの見解です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Azure

前の記事

Power Appsをいじってみた話
C++

次の記事

数独を解くやつ作ってみた