web-dev-qa-db-ja.com

書き換えルールを使用して、ディレクトリ./well-knownのhttpsリダイレクトの例外ルールを作成する方法

私の状況は次のとおりです。

  • サーバーA:support.example.com->ポート80がこのサーバーに転送されます
  • サーバーB:hr.example.com

両方ともApache2を実行しています。

サーバーBでは、Let's encryptを使用します。証明書を更新できるようにするために、./well-known/acme-challenge以外のすべてのHTTP要求をHTTPSにリダイレクトします。

サーバーAの仮想ホストは次のとおりです。

<VirtualHost *:80>
  ServerName hr.example.com
  Redirect / https://hr.example.com

  RewriteEngine on
  RewriteRule ^"/.well-known/acme-challenge\$" "<IP-SERVER B>/.well-known/acme-challenge" [PT]
</VirtualHost>

ただし、これにより、http://hr.example.com/.well-known/acme-challengeへのリクエストが実際にHTTPSにリダイレクトされます。どうすれば例外を作ることができますか?

4
WouterVE

LetsEncryptボットが使用するAcme Challengeプロトコルは、リダイレクトに従います。要求を別のマシンにリバースプロキシする必要はありません。それらの要求をそこにリダイレクトするだけです。

私は最初にチャレンジ用の特定のリダイレクトを作成し、次に他のすべてをHTTPSにリダイレクトします。

<VirtualHost *:80>
  ServerName hr.example.com
  Redirect permanent /.well-known/acme-challenge/ http://support.example.com/.well-known/acme-challenge/
  Redirect permanent / https://hr.example.com/
</VirtualHost>

この仮想ホストを作成し、hr.example.com/etc/hostsファイルに127.0.0.1として配置することで、サーバーでこの一連のルールをテストしました。

# curl -s --head http://hr.example.com/
HTTP/1.1 301 Moved Permanently
Location: https://hr.example.com/

# curl -s --head http://hr.example.com/.well-known/acme-challenge/foo
HTTP/1.1 301 Moved Permanently
Location: http://support.example.com/.well-known/acme-challenge/foo

多くの場合、書き換えルールとリダイレクトディレクティブを混在させることは問題です。どちらが最初に実行されるかは必ずしも明確ではありません。プロキシメソッドを使用する場合は、プロキシディレクティブに続く書き換えルールにリダイレクトを切り替えます。書き換えルールも少し変更しました。パススルールール([P])ではなく、プロキシルール([PT])である必要があります。また、ディレクトリ自体だけでなく、そのチャレンジディレクトリ内のすべてのファイルをプロキシする必要があります。

<VirtualHost *:80>
  ServerName hr.example.com    
  RewriteEngine on
  RewriteRule ^/.well-known/acme-challenge/(.*) http://<IP-SERVER B>/.well-known/acme-challenge/$1 [P,L]
  ProxyPassReverse /.well-known/acme-challenge/ http://<IP-SERVER B>/.well-known/acme-challenge/
  RewriteRule /(.*) https://hr.example.com/$1 [R=301,L]      
</VirtualHost>

私はブログについて 私が持っていた同様の問題。私が役立つと思ったトリックですが、あなたの状況と完全に一致していないように見えるのは、プロキシルールの例外を作成することでした。サイト全体をリバースプロキシしているが、acmeチャレンジをローカルで処理するために例外を作成する(またはリダイレクトすることを許可する)場合は、次の方法でそのディレクトリのプロキシを防止できます。

# Don't allow this directory to be reverse proxied
ProxyPass /.well-known/acme-challenge/ !
2