BASIC認証でLet’s encryptの証明書の更新に失敗する

certbotのrenewコマンドで証明書を更新する場合、certbotが生成したファイルにリモート側からHTTPSアクセスすることでドメインの正当性が検証される。しかしながら、BASIC認証を設定しているとこの検証に失敗する。リモート側からアクセスがBASIC認証によって阻まれるから。

たぶん以下のようなエラーメッセージが表示される。

Challenge failed for domain your.domain.com
Attempting to renew cert (your.domain.com) from /etc/letsencrypt/renewal/your.domain.com.conf produced an unexpected error: Some challenges have failed.. Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/your.domain.com/fullchain.pem (failure)

BASIC認証を解除するのもセキュリティ上はよくないので(たぶん必要だから設定していると思うので)、必要最小限の設定で切り抜けたい。

<Location />
  AuthType Basic
  AuthName "Authentication Required"
  AuthUserFile /hoge/hoge/.htpasswd
  Require valid-user
</Location>

ApacheならBASIC認証のためにこのような記述が*.confされている。Let’s encrypt (certbot)は/.well-knownへのアクセスを試みるので、そこへのアクセスのみBASIC認証を要求しないようにする。
そのためには、*.confに次の記述を追加する。

<Location /.well-known>
  Require all granted
</Location>

あとはApache2を再起動してサイトの設定を反映すればOK。次からはcertbotが成功するはず。

*.confを書き換える代わりに.well-known内の.htaccessでBASIC認証を無効化する方法でも同じような対処ができる。