BLOGTIMES
2012/05/30

リバースプロキシと Digest 認証

  networking  httpd  rfc 
このエントリーをはてなブックマークに追加

svn サーバをリバースプロキシ越しに使おうと思って mod_rewrite を使ってルールを書いてみたのですが、認証でコケるので困ってしまいました。
仕方がないので svn が入っているマシンの error_log を確認してみたところ、下記のような見慣れないエラーが出ていました。

[Wed May 30 19:28:13 2012] [error] [client ###.###.###.###] Digest: uri mismatch - </foo/bar/> does not match request-uri </baz/>

どうやら Digest 認証がうまくいってないようです。この svn サーバは Kanon で構築したものでしたが、認証がデフォルトで Digest だということをすっかりすっかり忘れていました。ダイアログが同じなので Basic 認証と勘違いしていました。ダイジェスト認証の仕様についてはRFC2617*1に詳細がありますが、ダイジェストの生成アクセス先の uri が含まれているので、リバースプロキシでオリジナルのサーバと違うパスにコンテンツをマッピングしてしまうと認証が通らなくなってしまうようです。このあたりではまっているのはどうやら僕だけではないようで、いろいろと事例*2が出てきます。

以下、設定メモ。

まず単純に rewrite して失敗

今回のサーバ構成はこんな感じです。

(Clients)    │    │ ┌───────────┐ │Proxy │ │ /~someuser/svn │ └───────────┘    │    │    │ ┌───────────┐ │Origin │ │ /svn │ └───────────┘

Origin は root を持っていますが、Proxy の方は一般ユーザーということで、 .htaccess だけでなんとかしなければならない状態でした。
とりあえず http://proxy.example.com/~someuser/svn/* → http://origin.example.com/svn/* とすればいいような気がしたので、下記のファイルを配置。

http://proxy.example.com/~someuser/svn/.htaccess

RewriteEngine on RewriteRule (.*) http://origin.example.com/svn/$1 [P,L]

ところがこの設定では、前述の Digest: uri mismatch が出て認証できませんでした。

さらに工夫してみる

仕方がないので、ググってみつけた事例*3を参考に origin のサーバにもユーザーディレクトリを掘って、さらに mod_rewrite することにします。

(Clients)    │    │ ┌───────────┐ │Proxy │ │ /~someuser/svn │ └───────────┘    │    │    │ ┌───────────┐ │Origin │ │ /~someuser/svn │ │ ↓(mod_rewrite) │ │ /svn │ └───────────┘

mod_rewriteの設定は下記のような感じになりました。

http://proxy.example.com/~someuser/svn/.htaccess

RewriteEngine on RewriteRule (.*) http://origin.example.com/~someuser/svn/$1 [P,L]

http://origin.example.com/~someuser/svn/.htaccess

RewriteEngine on RewriteRule (.*) /svn/$1 [PT]

これで Digest 認証は無事通るようになったので「いけるか?」と思ったのですが、無情にも svn は下記のようなエラーになってしまいました。

svn: PROPFIND request failed on '/svn/path/to/project' svn: PROPFIND of '/svn/path/to/project': 405 Method Not Allowed (http://proxy.example.com)

よく見ると、proxyマシンの /svn 以下のファイルに PROPFIND しようとしているのが確認できます。
おそらく svn で流れてくる情報のパスがオリジナルのパスになっているのでしょうが、さすがにこれ以上問題を深追いするのも難しくなってきました。

仕方がないので

もう仕方がないので、originの /svn のエイリアスを /~someuser/svn にも配置してしまうことにしました。
ちょっとダサいのですが、今回はここでタイムアップです。


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4983
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン