質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Q&A

解決済

1回答

2293閲覧

Let's encryptの証明書取得(認証)が失敗するようになってしまった

belgh

総合スコア27

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

0グッド

1クリップ

投稿2018/05/19 11:19

編集2018/05/19 11:34

Let's encryptの証明書取得(認証)が失敗する

証明書取得が失敗するようになりました。
毎月1回実行しているcron「certbot renew」が失敗しているのに気が付き、
応急処置的に行った
「**certbot certonly --webroot -w /srv/www/www.dummy.net/ -d www.dummy.net**」
も、環境構築時には成功していたのに失敗するようになっていました。

発生している問題・エラーメッセージ

certbot certonly --webrootで下記結果となります。

> certbot certonly --webroot -w /srv/www/www.dummy.net/ -d www.dummy.net Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator webroot, Installer None Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org Cert is due for renewal, auto-renewing... Renewing an existing certificate Performing the following challenges: http-01 challenge for www.dummy.net Waiting for verification... Cleaning up challenges Failed authorization procedure. www.dummy.net (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: The key authorization file from the server did not match this challenge [xKeqEHuUlchL7M6L0c-B9FWmfNsa3rGx80yIC3KMisc.f4UUZHSY0vEcB-GacmvQTf7FAgm4tXCXc7fYdVpoy4o] != [http://www.dummy.net/.well-known/acme-challenge/xKeqEHuUlchL7M6L0c-B9FWmfNsa3rGx80yIC3KMisc] IMPORTANT NOTES: - The following errors were reported by the server: Domain: www.dummy.net Type: unauthorized Detail: The key authorization file from the server did not match this challenge [SIqU8-wiN-yA4Vc39ArEUpHqyBamFQgc6o8xcKNnFvI.f4UUZHSY0vEcB-GacmvQTf7FAgm4tXCXc7fYdVpoy4o] != [http://www.dummy.net/.well-known/acme-challenge/SIqU8-wiN-yA4Vc39ArEUpHqyBamFQgc6o8xcKNnFvI]

certbot renewの方は、試行錯誤しすぎて下記エラーが出るようになってしまっています。

> certbot renew urn:acme:error:rateLimited :: There were too many requests of a given type :: Error creating new authz :: too many failed authorizations recently: see https://letsencrypt.org/docs/rate-limits/. Skipping.

certbot certonlyの方もリクエストしすぎエラーかとも思ったのですが、エラーメッセージは違うように見えます。

該当のソースコード

httpディレクティブ内で下記をincludeしています。
意図としては
「httpはhttpsに転送するが、Let'sencryptが要求するURLだけはhttpのまま応答する」
となります。

nginx

1server { 2 # トップページ 3 listen 443 ssl http2; 4 server_name www.dummy.net; 5 ~以下略~ 6} 7server { 8 # 未定義のpathは無応答とする 9 listen 443 ssl; 10 listen [::]:443 ssl http2; 11 server_name _; 12 ssl_certificate /etc/letsencrypt/live/www.dummy.net/fullchain.pem; 13 ssl_certificate_key /etc/letsencrypt/live/www.dummy.net/privkey.pem; 14 return 444; 15} 16server { 17 # httpはssl証明書認証以外はhttpsに飛ばす 18 listen 80; 19 server_name www.dummy.net; 20 access_log /srv/www/www.dummy.net/logs/access.log main; 21 error_log /srv/www/www.dummy.net/logs/error.log warn; 22 location /.well-known/acme-challenge/ { 23 root /srv/www/www.dummy.net/; 24 return 200 http://$host$request_uri; 25 } 26 location / { 27 root /srv/www/www.dummy.net/static/; 28 return 301 https://$host$request_uri; 29 } 30}

試したこと

・ブラウザから下記にアクセス
http://www.dummy.net/.well-known/acme-challenge/xKeqEHuUlchL7M6L0c-B9FWmfNsa3rGx80yIC3KMisc
→httpのページが表示され、URLが文字列として返ってきた。

http://www.dummy.net/somewhere
→httpsサイトに転送され、証明書がないのでブラウザ側で「このサイトは安全ではありません」エラーとなった。

nginxの振り分けは意図通りに動作しているように見えました。

補足情報(FW/ツールのバージョンなど)

nginx version: nginx/1.12.2
certbot 0.24.0

以上、よろしくお願いいたします。orz

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

原因がわかりました。

結論から書くとnginxのconfのせいでした。

nginx

1 location /.well-known/acme-challenge/ { 2 root /srv/www/www.dummy.net/; 3 return 200 http://$host$request_uri;** ←これが原因 4 }

certbotがリクエストする「/.well-known/acme-challenge/」のpathをリクエストそのままにreturnするという設定にしていたつもりでした。
が、内部的に何をしてるのか不明ですが、これがダメだったようです。

一時的にhttpsへの転送も消して、rootをcertbotに指定した/srv/www/www.dummy.net/にしたらすんなり通りました。

公式掲示板
Letsencrypt-vesta Client Error - The key authorization file from the server did not match

同じようなことで悩んでいる人がおり、斜め読みの意訳を書くと
「比較する認証keyが一致してないじゃん。サーバで転送とかしてない?」
とのこと。

確かに私のログはそこがおかしく、

[SIqU8-wiN-yA4Vc39ArEUpHqyBamFQgc6o8xcKNnFvI.f4UUZHSY0vEcB-GacmvQTf7FAgm4tXCXc7fYdVpoy4o]

!=
[http://www.dummy.net/.well-known/acme-challenge/SIqU8-wiN-yA4Vc39ArEUpHqyBamFQgc6o8xcKNnFvI]

keyがkey形式ですら無くURLになってしまっていました。
多分certbotがなにか処理をしており、nginxでreturnするとそれが行われないのだと思います。

上記を踏まえたconfの修正内容

nginx

1 location ^~ /.well-known/acme-challenge/ { # 1 2 allow all; # 2 3 default_type text/plain; # 3 4 root /srv/www/www.dummy.net/; 5 } 6 location / { # 4 7 root /srv/www/www.dummy.net/static/; 8 return 301 https://$host$request_uri; 9 }
  1. 「/.well-known/acme-challenge/」のパターンマッチ演算子は「^~」とする。

「^~」は最優先で判定され、マッチすると他のパターンマッチは行われない。

  1. Let's encryptのサーバは海外なので、海外IPを弾く設定をしている場合に必要。
  2. すみませんよくわかりません…。参考サイト見てのおまじない。わかる方教えてください。
  3. 「httpにアクセスされたらhttpsに転送する」処理。

修正前はlocation未指定で書いていたが、「/」のパターンマッチ内とするとこで、「^~」との振り分けができる。
これで1と合わせて、certbot認証時のみリダイレクトされなくなる。

投稿2018/05/19 19:46

編集2018/05/20 08:10
belgh

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問