昨晩 twitter で、「バックエンドのほうで Digest 認証されているところに mod_proxy で Reverse proxy できない」という話があったのでちょっと試してみた。
あれ?mod_proxyとかだとdigest認証出来ないのか?リバースプロキシにアクセスした時点で認証させる形とかmod_rewriteでゴニョゴニョさせる方法とかしか無いのかな。
結論から言うと、
という結果に。
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 になる。