0

webrickとsslをサポートするMITMプロキシを作成しています(クライアント側でVCRを使用してリクエストをモックアウトするには、このスレッドを参照してくださいVCRProxy:Capybaraまたは私のgithubリポジトリ内のVCRでPhantomJSajax呼び出しを記録するhttps://github.com/23tux/ vcr_proxy)、そして私はそれを本当に遠くまでやりました(私の意見では)。私の構成では、phantomjsはプロキシを使用し、SSLエラーを無視するように構成されています。そのプロキシ(webrickで記述)は、VCRを使用して通常のHTTPリクエストを記録します。SSLリクエストが行われると、プロキシは別のwebrickサーバーを起動し、リクエスト用にマウントして/再書き込みしunparsed_uriます。これにより、元のサーバーではなく、起動したばかりのwebrickサーバーが呼び出されます。新しく起動したサーバーがリクエストを処理し、VCRなどで記録します。

cURLを使用してMITMプロキシをテストすると、すべてが正常に機能します。たとえば、curlによって行われたリクエストは次のようになります

curl --proxy localhost:11111 --ssl --insecure https://blekko.com/ws/?q=rails+/json -v

処理され、記録されます...

しかし:javascriptからポルターガイストによって提供されたページ内でjsonp ajaxリクエストを使用して同じリクエストを実行しようとすると、問題が発生します。問題の原因となっている行にデバッグしました。これは、 (Ruby 1.9.3)httpserver.rbのrubyソースコード内のfromwebrick内にあります。line 80

def run(sock)
  while true
    res = HTTPResponse.new(@config)
    req = HTTPRequest.new(@config)
    server = self
    begin
      timeout = @config[:RequestTimeout]
      while timeout > 0
        break if IO.select([sock], nil, nil, 0.5)
        timeout = 0 if @status != :Running
        timeout -= 0.5
      end
      raise HTTPStatus::EOFError if timeout <= 0
      raise HTTPStatus::EOFError if sock.eof?

最後の行では、 phantomjsraise HTTPStatus::EOFError if sock.eof?を使用してリクエストを実行すると、エラーが発生します。理由は次のとおりです。sock.eof? == true

1.9.3p392 :002 > sock
 => #<OpenSSL::SSL::SSLSocket:0x007fa36885e090> 
1.9.3p392 :003 > sock.eof?
 => true 

私はcurlコマンドでそれを試しましたが、そこにあるsock.eof? == falseので、エラーは発生せず、すべてが正常に機能します。

1.9.3p392 :001 > sock
 => #<OpenSSL::SSL::SSLSocket:0x007fa36b7156b8> 
1.9.3p392 :002 > sock.eof?
 => false 

私はルビーでのソケットプログラミングの経験がほとんどないので、少し行き詰まっています。

sock変数に基づいて、2つのリクエストの違いをどのように知ることができますか?rubyのIOドキュメントでわかるようにeof?、反対側がデータを送信するか、データを閉じるまでブロックします。私は正しいですか?しかし、同じリクエスト、同じパラメーター、同じメソッドをphantomjsで呼び出すと閉じられ、curlを使用すると閉じられないのはなぜですか?

誰かが私がこれを理解するのを手伝ってくれることを願っています。どうも!

4

1 に答える 1

1

これはHTTPSなので、クライアントが接続を閉じているに違いありません。HTTPSでは、これはサーバー証明書が無効な場合などに発生する可能性があります。どのようなHTTPSライブラリを使用していますか?これらのライブラリは通常、SSL CERTを無視し、無効な場合でも機能し続けるように構成できます。

curlでは、実際には-k(--insecure)を使用してこれを実行していますが、これがないと機能しません。このオプションなしでこれを試してください。curlが失敗した場合、サーバー証明書は無効です。これを機能させるには、通常、チェックをオフにするか、クライアントが検証できるように有効な証明書をクライアントに提供する必要があります。

于 2013-03-22T09:18:54.747 に答える