自分用めも

初心者ちっくなプログラムネタを中心に、自分用の覚え書きをメモっていくための場所です。

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を外すとエラーにならない)