ssl.confに記述したmod_rewriteの設定で、HTTPのTRACEメソッドが無効になっているかを確認する方法

ssl.confに記述したmod_rewriteの設定で、HTTPのTRACEメソッドが無効になっているかを確認する必要が出てきた。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{REQUEST_METHOD} ^TRACE
  RewriteRule .* - [F]
</IfModule>

例えば上記のような設定をssl.confに記述したときに、mod_rewriteの設定が意図通りになっているか確認したいとする。SSLを使っていなければ、telnetで以下のような操作をすれば確認できるんだけど、SSLを使っている時はどうすれば良いか分からなかった。

$ telnet www.hoge.jp 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
TRACE / HTTP/1.0
TEST: TRACE_TEST


HTTP/1.1 403 Forbidden
Date: Tue, 09 Dec 2008 13:56:35 GMT
Server: Apache
Accept-Ranges: bytes
Content-Length: 5044
Connection: close
Content-Type: text/html; charset=UTF-8

....

Connection closed by foreign host.
  1. telnetで調べたいホストの80ポートにアクセス
  2. HTTPのTRACEメソッドでリクエストを書く
  3. 403コードが返ってくればTRACEメソッドが無効になっていると判断できる。200などのコードが返ってきたら有効になっている。

SSLを使っている場合は、HTTPのプロトコルでサーバーとお話をする前に、SSLでサーバーとお話をしなくてはならないため、telnet越しにお話するのはかなり面倒くさい。そんなときは、opensslコマンドのs_clientを使うと良い。

まずは、opensslコマンドを以下のように使う。

$ openssl s_client -host www.hoge.jp -port 443
....
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---

勝手にSSLで話してくれ、HTTPでお話できるところまで進めてくれる。
後はtelnetと同じようにHTTPでお話すれば、TRACEメソッドが無効になっているかどうかが確認できる。

$ openssl s_client -host www.hoge.jp -port 443
....
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
TRACE / HTTP/1.0
TEST: TRACE_TEST


HTTP/1.1 403 Forbidden
Date: Tue, 09 Dec 2008 13:56:35 GMT
Server: Apache
Accept-Ranges: bytes
Content-Length: 5044
Connection: close
Content-Type: text/html; charset=UTF-8

....

Connection closed by foreign host.

かなり便利だったのでメモ。