« GMOからnonIP SSLサービス開始 | メイン | 鉄板のアクセス数増加方法 »

2007年6月16日

Upgrading to TLS(RFC2817)の設定をApache2.2にしてみる >>Apache 

Name Based SSLについてもうちょっと腰を入れて調べる。

IE7ではRFC3546 のServer Name Indicationの対応がされている。

Apacheの方では、RFC3546は、mod_gnutlsを入れれば対応は可能なようです。

mod_gnutlsのサイトはこちら。
http://www.outoforder.cc/projects/apache/mod_gnutls/

が、2005年から時が止まったまま・・・。むう。
そのうち試してみようとは思ってますけども・・・。

Apache2.2から
RFC2817 Upgrading to TLS Within HTTP/1.1の対応がされている。
現状ブラウザの対応がされていないので待ちということだが、そもそもサーバ側の設定はどうすんねや?ということでちょっと設定してみる。

Port443の設定はとりあえずそのままで・・・
Port80のNamebased virtualhost の中に

SSLEngine Optional

...以下、SSLの定義
としておくとよさそう。
で、サーバ側としてSSLを必要とするディレクトリを指定しておけば良いです。
そう記述しておかないと、SSL接続がされないで平文となる可能性がある。

NameBased VirtualHost内に・・・
<Directory /nantoka/kantoka>
SSLRequireSSL
</Directory>

と書いておけばSSLが必要とされます。
(暗号化しなきゃだめだよ、とダメ出しはできるが、クライアントが先走ってデータを送ってくる可能性もあんだよねえ。その辺はクリアになってなさそうな・・・。とすると、「ここで○○して良いですかー?」と問いかけをまずしなきゃならず、これはクライアント側の実装の方が大切だということになる仕様なのかも・・・。それやったら、Server Name Indicationの方が実装しやすそうだけどなー。)

で...こんな感じで設定して、apacheをリスタート。
ブラウザからGETをかけてみると・・・

Upgrade Required

という表示がなされます。
一応これで、サーバ側からOptionalのSSL接続を必要とする・・・426 Upgrade Required、というところまではざっと設定できました。

クライアントからの要求をかけると....
OPTIONS * HTTP/1.1
Host: hogehoge.jp
Upgrade: TLS/1.0
Connection: Upgrade

HTTP/1.1 101 Switching Protocols
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade

という返答が返ります。

ただ、この後のTLSコネクション・・・こっから先が本番の暗号化やりとりですが、うまくいっていません。
もう少々サーバ側の設定でやらなきゃいけなさそうな気もしつつ、クライアント側も頑張らねばならなさそうですから、正解がまだわっからねーなあ、というところです。
これで問題なし!っていうネタじゃなくてすんまそん。 もしかしてコレか?とか思いついたらまたやってみます。

・・・・うーん、つーか普及してもふつーにデバッグしづらいな、これだと。。

RFC2817
日本語訳:
http://helppc.jp/security/rfc/RFC2817JA.html
原文:
http://www.ietf.org/rfc/rfc2817.txt

RFC3546
http://www.ietf.org/rfc/rfc3546.txt

追記2007/06/17 @15:17
rfc2817でクライアントにデータ送信(GET/POST)は『暗号化が確立してから送れ』という指定をするとなると、上にも書いた通りサーバ側との事前打ち合わせのConnectionを張らねばならなくなります。
session keep-aliveでいけば再Connectionをしなくて済むのでコストは少なく済むが、そうではない場合、Connection数が単純に2倍となるのではないかと想定される。

keep-alive off にしたApacheで、optionsが使えない場合は、
OPTIONS * HTTP/1.1
Host: hogehoge.jp
Upgrade: TLS/1.0
Connection: Upgrade

HTTP/1.1 200 OK
Date: Sun, 17 Jun 2007 06:49:24 GMT
Server: Apache/2.2.4 (Unix) mod_ssl/2.2.4 OpenSSL/0.9.8c PHP/4.4.7
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Length: 0
Connection: close
Content-Type: text/plain

で、一旦切られる。keep-aliveが効けば、そのまま継続できるが。

簡単に指定するとなるとhtmlタグを拡張して・・・
<form method="post/get" action="nantoka" tls="must">
とすると、クライアント(ブラウザ)はタグを解釈してtlsを使って80に送る・・・というように拡張されれば少しは解決しそうな気もします。
ただ、tcpセッションレベルではない話となるので、それもどうか、というところです。

って・・・いうか、全てのデータのやり取りがTLSでされることが望ましいという思想ならば、クライアントとしてはまずupgradeが効くか確認して、HTTP/1.1 101 Switching Protocols・・・のあと完了してからデータを送る。ただ、やはりkeep-alive offにしたサーバはコネクション数の増加に悩まされることになる。
(思考ループ中)・・・・・・・うーん、微妙だ。

twitterこの記事をTwitterでみんなに教える。

投稿者 debizoh : 2007年6月16日 21:29



トラックバック

現在、この記事はトラックバックを受け付けておりません。


このリストは、次のエントリーを参照しています: Upgrading to TLS(RFC2817)の設定をApache2.2にしてみる:

» stone に Server Name Indication (TLS 拡張) 機能を実装 from 仙石浩明の日記
RFC 3546 で、 TLS (Transport Layer Security つまり SSL) の拡張が規定された。 その中の一つが、「Se... [続きを読む]

トラックバック時刻: 2007年6月25日 07:20

コメント

現在、この記事はコメントを受け付けておりません。