Digest 認証と Reverse proxy の話

昨晩 twitter で、「バックエンドのほうで Digest 認証されているところに mod_proxy で Reverse proxy できない」という話があったのでちょっと試してみた。

結論から言うと、

  • uri (path) が表と裏で同一なら問題なし
  • 別の uri ( 表:/foo => 裏:/bar など ) だと認証に失敗する

という結果に。

Digest 認証のアルゴリズムでは、Authorization ヘッダの生成に uri も使用するため、クライアントが認識している uri とバックエンドが認識している uri が異なるとヘッダの検証に失敗する、というのが原因らしい。

今回は reverse proxy もバックエンドも Apache-2.2 だけど、おそらく他の web server でも事情は同じはず。

以下検証作業ログ。

実は Digest 認証をちゃんと使ったことがなかったので適当に設定。バックエンドは CentOS-5 / Apache-2.2.3

AuthType Digest
AuthName "Secret Zone"
AuthDigestDomain /digest/
AuthDigestProvider file
AuthUserFile /tmp/htdigest
Require user secret
$ htdigest -c /tmp/htdigest "Secret Zone" secret

Reverse Proxy は Apache-2.2.17 をソースから proxy 有効にしてインストール。

$ ./configure --enable-proxy --prefix=/path/to/apache

httpd.conf に ProxyPass 設定

Listen 10080
ProxyPass /digest http://127.0.0.1/digest

これで表も裏も /digest という uri になるが、これだと問題なく認証が通る。

ProxyPass /xxxxxx http://127.0.0.1/digest

このように、表 /xxxxxx => 裏 /digest とすると、裏のほうでエラーログに

Digest: uri mismatch - </xxxxxx/> does not match request-uri </digest/>

と記録され、400 Bad Request になる。