SPDY パケット読むまでのメモ

最近は SPDY プロトコルが流行っているようなので,"SPDYと「やったー、net-http-spdyできたよー」の話 - I am Cruby!" の記事の net-http-spdy を動かして,パケットを取得しようとしてみたら,手間取った点がいくつかありましたので,設定した内容等を適当に書いておきます.

実行

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 でも見てみます.
f:id:Hexa:20130126185718p:plain

  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 は下記になっていました.
f:id:Hexa:20130126203653p:plain

  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
f:id:Hexa:20130126203505p:plain

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 の詳細については,下記を参照してください.

Server Hello
f:id:Hexa:20130126203446p:plain

Cipher Suite が TLS_RSA_WITH_AES_256_CBC_SHA (0x0035) であることが確認できます.

復号(ssl でフィルタ)
f:id:Hexa:20130126185350p:plain

"Decrypted SSL data" のタブが増えていますので,spdy パケットを確認できるようになっています.
f:id:Hexa:20130126203533p:plain