とある会社からの仕様の要求で
「サーバーに設定されているOpenSSLが再ネゴシエーション
(renegotiation)が可能なバージョンであるか確認してくれ」
というものが来ました。
これは困った。
なんせSSL関連は殆ど触った事がない。
と言う事で、調べてみました。
そもそもに「OpenSSL0.9.8l」以外ならば大体大丈夫という話なので
調べてみたら、OpenSSL0.9.8lでrenegotiationに関する脆弱性対策のために
機能自体が停止されているんですね…。
ちなみにOSはCentOS5で、現在yumで流れてきてるバージョンが
OpenSSL 0.9.8e-fips-rhel5 と言う事で、数年前から更新されてないんですよね。
ただこれはこれで色々厄介で、まぁアップデートをすればいいんですが、
単純にyumでdeleteして最新版をインストールしようとすると
200件近くの関連ファイルが出てきて、削除しちゃうと
真っ当に動かなくなるとか言う報告が。
※ソースは失念しましたスイマセン
怖くてヘタにいじれないなぁ。
というわけで、まずは現在のバージョンで再ネゴシエーションが可能かどうかの検証
これがなかなか検証方法が(日本語サイトでは)参考サイトが少ないんですよね。
今回はコチラを参考にさせて頂きました
https://upki-portal.nii.ac.jp/ml-archives/upki-odcert/msg00041.html
※本来ここに書いてある事を全て読んで理解出来てないとダメなんですよね
で、色々調べた結果
http://www.g-sec.lu/practicaltls.pdf
ここの24項に確認方法が載ってます
1.opensslコマンドによる確認方法 その1 $openssl s_client -connect example.com:443 < /dev/null
※example.comは適宜置き換えて下さい
これを実行したときに
Secure Renegotiation IS supported
の文章が出ている場合は、対応済みだそうで。
って、あれ?対応済みだ。
2.Firefoxによる確認方法
Firefox 3.6.2以降および3.5.9以降では、脆弱性対応(RFC 5746実装)し
ていないサーバにアクセスするたびにログを残すようなったとの事。
[ツール]→[web開発]→[エラーコンソール]でエラーコンソールを開いて
非対応のサーバにアクセスすると、
example.com : potentially vulnerable to CVE-2009-3555
といった感じに表示されるそうで
って、あれ出てない?対応済みだ。
3.opensslコマンドによる確認方法 その2
$openssl s_client connect example.com:443
GET / HTTP/1.0
Host:connect example.com
R
これでRenegotiationをかけに行ってくれるようなんですが…
22877:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:530:
あーるぇぇぇぇ?
とりあえずエラーが出ているのはわかる
もうわからん(エラーの意味を理解してないw)
4.opensslコマンドによる確認方法 その3
もう一つ、opensslコマンドを使った確認方法があります。
-no_legacy_server_connectオプションを付けて上記s_clientを実行
すると、非対応のサーバに接続しなくなります。
とありましたので、こちらも試してみる。
$openssl s_client -no_legacy_server_connect -connect example.com:443 < /dev/null
こちらはちゃんと繋がりました…。
ダメな時は以下のメッセージが出る模様
28844:error:14123143:SSL routines:SSL_PARSE_SERVERHELLO_TLSEXT:unsafe legacy renegotiation disabled:t1_lib.c:313:
28844:error:140920DF:SSL routines:SSL3_GET_SERVER_HELLO:parse tlsext:s3_clnt.c:798:
のようにエラーが出た場合はサーバがまだ対応していないことを意味します。
結局対応してるのか?大丈夫なのか??
ちなみに外部ツールとして
http://netsekure.org/2009/11/tls-renegotiation-test/
https://www.ssllabs.com/ssldb/index.html
この二つが紹介されてましたが、
前者の方はダメ。
後者の方は
Secure Renegotiation:Supported, with client-initiated renegotiation disabled
これは条件付きでサポートしてますよって事?
http://blog.abacustech.co.jp/blogx/entry/40
こちらも参考にさせて頂きましたが、
「OpenSSL 0.9.8lより前とコンパイルした場合はクライアントがinitiateしたrenegotiationを拒否。」
これは条件付きで可って話なんでしょうが、今回要求されている仕様を満たしているんだろうか?
うーむ、SSL自体をちゃんと理解してないから分からないんだろうな
とりあえず、勉強が足りんと言う事ですね。
コメント
「OpenSSL 0.9.8lより前とコンパイルした場合はクライアントがinitiateしたrenegotiationを拒否。」
については、0.9.8lのOpenSSLはrenegoをのきなみ拒否するだけの修正がされたものなので、
「サーバーに設定されているOpenSSLが再ネゴシエーション
(renegotiation)が可能なバージョンであるか確認してくれ」
の答えとしては「renegoが可能なバージョンではない」です。
質問としては「secureなrenegoが可能かどうか」なのか、「脆弱なrenegoが可能かどうか」なのかをはっきりさせておかないといけないです。