5

同様の質問

私の場合は違います。を使用して SSL クライアントを作成しましboost::asio::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 によって行われる事前検証 (boost のどこでも OpenSSL と同等の関数を呼び出していると言うため) で十分であると想定しているため、verify_callback ハンドラーは提供していません。マイナス面はありますか、それとも <1> に影響しますか?

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

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

4

1 に答える 1

1

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

相手側が書き込みを行わなかった接続でブロッキング読み取りを行った場合、何が起こると予想されますか? それは永久にブロックされます。ここでは、相手側が決してハンドシェイクを行わない接続でブロッキング ハンドシェイクを実行しました。あなたのコードは、あなたが要求したように、それが完了するまで待機します。

于 2013-03-12T21:50:07.703 に答える