2013-03-12 2 views
5

similar questionBoost Asio SSL квитирование никогда не возвращается

Мое дело иное. Я написал 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. Я не предоставляю обработчик check_callback, потому что предполагаю, что предварительная проверка, сделанная OpenSSL (потому что везде в boost она говорит, что она вызывает эквивалентную функцию OpenSSL) должно быть достаточно. Есть ли недостаток в нем или это может повлиять на < 1>?

  3. Это тривиальный вопрос, но только для того, чтобы убедиться, что он не вызывает проблем. Как правило, примеры в boost показывают, что объект контекста ssl был задан, прежде чем давать его в ctor ssl::stream<tcp::socket>. Я, однако, даю это раньше (в ctor выше), а затем изменяя свойства в connect(). Отразится ли это на поведении построенного ssl :: stream (потому что он берет по ссылке, и я надеюсь, что он не сделает никаких копий)?

На стороне записки (если это полезно), я создал CA, CA корневого раздела самозаверяющего PEM сертификат, сертификат сервера, подписанный CA сертификат. Сертификат CA - это то, что я даю load_verify_file(...).

ответ

0

Вы решили вызвать операцию, которая блокирует до тех пор, пока она не завершится или не завершится с ошибкой, но она не делает этого, поэтому она блокируется навсегда. Если вы не хотите блокировать столько, сколько требуется для успешной или неудачной операции, не вызывайте операцию, специально предназначенную для этого.

Если вы сделали блокировку, прочитанную в соединении, где другой конец никогда не писал, что бы вы ожидали? Это будет заблокировано навсегда. Здесь вы сделали блокировку рукопожатия в связи, где другой конец никогда не будет с вами рукопожатием. Ваш код ждет, пока он это сделает, точно так же, как вы его просили.

Смежные вопросы