2013-03-12 14 views
5

similar questionSSLハンドシェイクを返すことはありません

私の場合は異なっています。 boost::asio::sslを使用してSSLクライアントを作成しましたが、現在は他のグループによって開発されているため、テストするサーバーはありません。したがって、現在のサーバーは単純なTCP(安全でない)接続のみを受け入れます。サーバーに対してSSLクライアントを使用すると、ブロックhandshake()がハングしたり返されたりしません。私はネットを検索し、Mozillaにも同様の問題があることが判明しました。非SSL対応サーバーへのSSL接続を開始するとハングしますが、そのバグは修正されています。私は何のコーディングエラーがありませんを確認するために私のコードの部分に説明を入れます:

ctorに:その後、

SecuredConnectionPolicy<ThreadPolicy>::SecuredConnectionPolicy() : 
    m_sslContext(boost::asio::ssl::context::sslv23), 
    m_socket(m_ioService, m_sslContext) //ssl::stream<tcp::socket> 
{ 

} 

とき私の「connect(...)」が呼び出されます。

m_sslContext.set_options(boost::asio::ssl::context::default_workarounds); 

    m_sslContext.set_verify_mode(
      boost::asio::ssl::context::verify_none, 
      errorCode 
      ); 

    if(!errorCode) 
    { 
     /*m_sslContext.set_verify_callback(
       [this](bool bIsPreverificationSuccessful, boost::asio::ssl::verify_context &context){return this->verificationHandler(bIsPreverificationSuccessful, context);}, 
       errorCode 
       );*/ 

     if(!errorCode) 
     { 
     m_sslContext.load_verify_file("newcert.pem", errorCode); 

     if(!errorCode) 
     { 
      m_socket.lowest_layer().connect(remoteEndpoint, errorCode); 

      if(!errorCode) 
      { // ########### Following NEVER RETURNS ############# 
       m_socket.handshake(boost::asio::ssl::stream_base::client, errorCode); 

       if(errorCode) 
       { 
        std::cerr << "Secured Connection Handshake Failed! " << errorCode.message() << std::endl; 
       } 
      } 
      else 
      { 
       std::cerr << "Secured Connection Failed! " << errorCode.message() << std::endl; 
      } 
     } 
     else 
     { 
      std::cerr << "Secured Connection loading certificate files from default paths Failed! " << errorCode.message() << std::endl; 
     } 
     } 
     else 
     { 
     std::cerr << "Registering Verification callback failed! " << errorCode.message() << std::endl; 
     } 
    } 
    else 
    { 
     std::cerr << "Secured Connection verify mode Failed! " << errorCode.message() << std::endl; 
    } 
  1. 何が原因である可能性がありますか?何か間違っているのですか?

  2. 私は、OpenSSLによって行われた事前検証(どこでも、それがOpenSSL同等の機能を呼び出すと言っているので)で十分であると仮定しているので、verify_callbackハンドラを提供していません。そこに何か欠点がありますか?これは<に影響を与えますか?

  3. これは些細なことですが、問題が発生しないことを確認するだけです。一般的に、ブーストでは、sslコンテキストオブジェクトがssl::stream<tcp::socket>のctorで与えられる前に設定されています。私はしかし、前に(上記のctorで)それを与えて、後でconnect()のプロパティを変更しています。これらは、構築されたssl :: streamの動作に反映されるでしょうか?(これは参照によるもので、コピーを作成しないことを望むからです)

私はCAルートキー、CA自己署名PEM証明書、CA証明書で署名されたサーバー証明書を作成しました。 CA証明書は私がload_verify_file(...)に与えているものです。

答えて

0

完了または失敗するまでブロックする操作を呼び出すことを選択したが、どちらも実行されず、永久にブロックされます。操作の成功または失敗に必要な時間をブロックしたくない場合は、それだけを文書化した操作を呼び出さないでください。

書き込みを行ったことがない接続でブロッキング読み出しを行った場合、どうなるでしょうか?それは永遠にブロックされます。ここでは、相手側が決してあなたとハンドシェイクを行わない接続でブロッキングハンドシェイクを行ったことがあります。あなたのコードは、あなたがそれを要求したのと同じように、それまで待っています。

関連する問題