2013-03-12 3 views
5

similar question부스트 Asio SSL 핸드 셰이크가 절대 반환되지 않습니다

내 경우가 다릅니다. boost::asio::ssl을 사용하여 SSL 클라이언트를 작성했지만 현재 다른 그룹이 개발 중이므로 테스트 할 서버가 없습니다. 따라서 현재 서버는 일반 TCP (안전하지 않은) 연결 만 허용합니다. 서버에 대해 내 SSL 클라이언트를 사용하면 차단 handshake()가 중단되거나 절대로 반환되지 않습니다. 나는 그물을 뒤져서 모질라가 비슷한 이슈를 가지고 있다는 것을 알아 냈다. - 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. 나는 그 preverification이 OpenSSL에 의해 행해졌다고 가정하기 때문에 verify_callback 핸들러를 제공하지 않는다. 거기에 어떤 단점이 있습니까 또는 영향을 수 < 1>?

  3. 이것은 사소한 것이지만 문제가 발생하지 않는지 확인하는 것입니다. 일반적으로 boost 예제에서는 ssl 컨텍스트 개체가 ssl::stream<tcp::socket>의 ctor로 제공되기 전에 설정되었음을 보여줍니다. 나는 그러나 (위에 ctor에서) 그리고 나중에 connect()에서 속성을 변경하기 전에 그것을주고있다. 이러한 것들이 생성 된 ssl :: stream의 동작에 반영 될 것인가? (참조에 의해 소요되고 어떤 복사본도 만들지 않기를 희망하기 때문에)?

(유용 할 경우) CA 루트 키, CA 자체 서명 PEM 인증서, CA 인증서로 서명 된 서버 인증서를 만들었습니다. CA 인증서는 내가 load_verify_file(...)에게주고있는 것입니다.

답변

0

완료 또는 실패 할 때까지 차단하는 작업을 호출하도록 선택했으나 둘 다 수행하지 않으므로 영원히 차단됩니다. 작업이 성공적으로 성공 또는 실패하는 데 걸리는 시간을 차단하고 싶지 않다면,이를 문서화 한 작업을 호출하지 마십시오.

상대방이 쓰기를 한 적이없는 연결에서 차단 읽기를 수행했다면 어떻게 될 것으로 예상됩니까? 그것은 영원히 막을 것입니다. 여기에서는 상대방이 절대로 상대방과 악수를하지 않을 연결에서 차단 핸드 셰이크를 수행했습니다. 요청할 때까지 코드는 기다릴 때까지 기다립니다.

관련 문제