Nginx で NextCloud 12 を動かしてるホストで Let’s Encrypt の証明書を更新する時の設定備忘録

スポンサーリンク

 Let’s Encrypt の証明書更新は今まで問題無く certbot renew で出来ていたが、NextCloud 12 になってから初の自動更新でエラーが返ってきた。
 Nginx の設定を多少弄くる必要があったのでその変更メモ。

既存設定

 今までは http でリクエストがあれば https にリダイレクトをして丸投げし、https で Listen してる server ブロック内で acme-challenge に対する記述をしておけばそれだけで certbot による証明書更新のドメイン認証は正常に動作していた。

server {
    listen 80;
    server_name cloud.example.com;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name cloud.example.com;
    root /var/www/html/nextcloud;

中略

    location /.well-known/acme-challenge {
    }

NextCloud 12 にしてから出たエラー

 certbot が残すログから拾うと次のようなエラーに。

FailedChallenges: Failed authorization procedure. cloud.example.com (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://cloud.example.com/.well-known/acme-challenge/BcsF0xl3H-CAgeTFrZ8J3XE5LJsLPosovYsx2LrSciM

 .well-known/acme-challenge 以下にランダムで作成されたドメイン認証の為のチャンレンジファイルとでも言うのか分からないが、そこへのアクセスに対するレスポンスが向こうの期待する物では無かったということでエラーが返された。
 実際に該当ディレクトリへ適当なファイルを作成し、ブラウザ上からアクセスすると NextCloud が「アクセスが禁止されています」とエラーを吐く形でレスポンスを返していた。NextCloud から見るとそう言うファイルは無いので無効なアクセスですよってな事で。
 NextCloud の制御でエラーを返されてしまうのが問題なので、もっと手前から Nginx で制御をしてやる必要があると。

修正後の設定

 Let’s Encrypt のドメイン認証は基本的に http で行われるので、Nginx で http の server ブロック内で上手いこと出来ないかググったりして調べたら理にかなった設定を見つけた。

server {
    listen 80;
    server_name cloud.example.com;
    root /var/www/html/nextcloud;

    location /.well-known/acme-challenge/ {
        try_files $uri /dev/null =404;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

 https 側の server ブロック内の同 acme-challenge に対する記述は勿論削除しておく。

 ”/.well-known/acme-challenge/” 以下へのアクセスは受けとった URI 通りに評価してレスポンスを返し存在しないファイルに対しては 404 を返す。それ以外のアクセスは https にリダイレクトさせてしまおうという事だ。

結果として

 最終的な上記の設定に至るまで、試行錯誤しているうちにドメイン認証の Limit rate 上限に達してしまったので暫く時間をあけた後に試した所、正常に証明書が更新された
 以後、このままの設定でいこうと思う。

スポンサーリンク