Let's Encryptの自動更新がunauthorizedで失敗した時の設定
2018/05/20 間違っていたので修正しました。
nginx/1.12.2
certbot 0.24.0
参考にさせていただいたサイト
Let’s Encryptでrenewが失敗するときのTips
Let's encrypt のWeb認証に失敗する場合の許可の通し方
エラー内容
上記参考サイトと同じく、
certbotのエラーログに「unauthorized」「Invalid response from~」が出ていた。
Type: unauthorized Detail: Invalid response from http://HOGE.com/.well-known/acme-challenge/
修正前
私の設定ではhttpにアクセスしたらhttpsに転送するようにしている。
server {
listen 80;
server_name HOGE.com;
root /srv/www/HOGE.com/static/;
return 301 https://$host$request_uri;
}
修正後
そこで参考サイト様と同様に、
port80宛の「/.well-known/acme-challenge/」だけはそのまんま通すようにした。
server { listen 80; server_name HOGE.com; root /srv/www/HOGE.com/static/; location ^~ /.well-known/acme-challenge/ { root /srv/www/HOGE.com/; # 2018-05-20訂正 # return 200 http://$host$request_uri; } # return 301 https://$host$request_uri; lacation / { return 301 https://$host$request_uri; } }
やったこと&ポイント
- 「/.well-known/acme-challenge/」宛のリクエストのrootは、certbotに指定しているrootと同じにする。
- 比較演算子は「^~」とする。nginxでは「^~」がパターンマッチの条件として最優先される。
- 「httpにアクセスしたらhttpsに転送する」と言う設定を、「lacation /」内に移動する。これで本当に、「/.well-known/acme-challenge/」宛だけはhttp、それ以外はhttpsへ転送 が実現する。
- return 200は行わない。certbot実行時、指定ディレクトリへのリクエストをcertbotがなにか処理しているっぽいのだが、return 200で返すと恐らくその処理が行われない。結果としては認証keyが合わずエラーとなる。(return 200を外すとエラーにならない)