SPDY パケット読むまでのメモ
最近は SPDY プロトコルが流行っているようなので,"SPDYと「やったー、net-http-spdyできたよー」の話 - I am Cruby!" の記事の net-http-spdy を動かして,パケットを取得しようとしてみたら,手間取った点がいくつかありましたので,設定した内容等を適当に書いておきます.
環境
- Web サーバ
- クライアント
- Ruby 2.0.0-rc1
- net-http-spdy (authorNari/net-http-spdy · GitHub)
- Ruby 2.0.0-rc1
実行
example を参考にして,上記環境のサーバにアクセスしてみる
とりあえず,下記のようにしてみました.
require 'net/http/spdy' fetch_threads = [] Net::HTTP::SPDY.start(uri.host, uri.port, use_ssl: true) do |http| 10.times do uri = '/index.html' req = Net::HTTP::Get.new(uri) fetch_threads << Thread.start do http.request(req) end end fetch_threads.each(&:join) end
実行すると下記のエラーになりました.
/opt/ruby/2.0.0-rc1/lib/ruby/2.0.0/net/http.rb:917:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
Wireshark でも見てみます.
Alert (Level: Fatal, Description: Unknown CA)
ルート CA 証明書を指定していないので当然ですね.
ca_file オプションを指定してみる
下記のように ca_file を追加します.
Net::HTTP::SPDY.start(uri.host, uri.port, use_ssl: true, ca_file: './ca.pem') do |http|
エラーにならずに,Application Data の送受信が繰り返され続けます.
$ ruby spdy.rb
ここで,Wireshark で Application Data を復号して,送受信されているパケットを確認しようとしてみましたが,Wireshark に秘密鍵を設定しても復号できませんでした.
そこで,Server Hello を見てみると,Cipher Suite は下記になっていました.
Cipher Suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x009f)
DHE の場合は復号されないのかな?
ciphers オプションを指定してみる
とりあえず,Cipher Suite を変更してみます.
Cipher Suite は,クライアントが Client Hello で Cipher Suites をサーバに送って,
その中から 1 つを選んでサーバが Server Hello でクライアントに送るので,
クライアントから送る Cipher Suites に,使用したい Cipher Suite だけを指定するか,
または,サーバ側で,使用したい Cipher Suites だけを返すように設定します(mod_ssl の場合は SSLCipherSuite ディレクティブを設定します).
SSLCipherSuite ディレクティブについては,下記を参照してください.
今回はクライアントからの Cihper Suite をしてしてみます.
下記のように ciphers を追加します.
Net::HTTP::SPDY.start(uri.host, uri.port, use_ssl: true, ca_file: './ca.pem', ciphers: 'AES256-SHA') do |http|
Wireshark で確認してみます.
Client Hello
Cipher Suites には下記の 2 つが含まれていました.
TLS_RSA_WITH_AES_256_CBC_SHA (0x0035) TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff)
TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff) は,SSL および TLS の renegotiation の脆弱性対応です.
renegotiation の脆弱性や TLS_EMPTY_RENEGOTIATION_INFO_SCSV の詳細については,下記を参照してください.
- RFC 5746 - Transport Layer Security (TLS) Renegotiation Indication Extension
- 情報処理推進機構:情報セキュリティ:調査・研究報告書:情報セキュリティ技術動向調査(2009 年下期)
Server Hello
Cipher Suite が TLS_RSA_WITH_AES_256_CBC_SHA (0x0035) であることが確認できます.
復号(ssl でフィルタ)
"Decrypted SSL data" のタブが増えていますので,spdy パケットを確認できるようになっています.
参考にしたページ
- SPDYと「やったー、net-http-spdyできたよー」の話 - I am Cruby!
- GettingStarted - mod-spdy - Getting started with mod_spdy. - Apache SPDY module - Google Project Hosting
- authorNari/net-http-spdy · GitHub
- mod_ssl - Apache HTTP Server
- RFC 5746 - Transport Layer Security (TLS) Renegotiation Indication Extension
- 情報処理推進機構:情報セキュリティ:調査・研究報告書:情報セキュリティ技術動向調査(2009 年下期)