2013-03-12 32 views
5

similar questionTăng cường bắt tay Asio SSL không bao giờ trả về

Trường hợp của tôi khác. Tôi đã viết một máy khách SSL sử dụng boost::asio::ssl nhưng hiện tại không có máy chủ để kiểm tra vì nó đang được phát triển bởi nhóm khác. Vì vậy, máy chủ hiện tại chỉ chấp nhận các kết nối TCP đồng bằng (không an toàn). Khi tôi sử dụng máy khách ssl của mình đối với máy chủ, việc chặn handshake() bị treo/không bao giờ trả về. Tôi đã tìm kiếm trên mạng và nhận rằng Mozilla cũng có vấn đề tương tự - nó treo khi bắt đầu kết nối SSL đến một máy chủ hỗ trợ không ssl, nhưng lỗi của họ là cố định. Tôi sẽ chỉ cần đặt giải thích đến các bộ phận của mã của tôi để đảm bảo không có lỗi mã hóa:

trong ctor:

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

} 

sau đó khi tôi "connect (...)" được gọi là:

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. Lý do có thể là gì? Tôi có làm gì sai không?

  2. Tôi không cung cấp bất kỳ trình xử lý verify_callback nào vì tôi giả định rằng quá trình preverification được thực hiện bởi OpenSSL (vì ở mọi nơi có nghĩa là nó gọi hàm OpenSSL tương đương) là đủ. Có bất kỳ nhược điểm nào hoặc điều này có ảnh hưởng đến < 1> không?

  3. Đây là một điều nhỏ nhặt nhưng chỉ để đảm bảo nó không gây ra sự cố: Nói chung các ví dụ trong chương trình tăng cường rằng đối tượng ngữ cảnh ssl đã được đặt trước khi đưa nó vào trong ctor ssl::stream<tcp::socket>. Tuy nhiên tôi đang cho nó trước (trong ctor ở trên) và sau đó thay đổi tài sản trong connect(). Điều này có được phản ánh trong hành vi của luồng ssl :: được xây dựng (bởi vì nó có tham chiếu và tôi hy vọng nó không tạo ra bất kỳ bản sao nào)?

Lưu ý phụ (nếu có ích), tôi đã tạo chứng chỉ CA do CA rootKey, CA ký, chứng chỉ máy chủ được chứng chỉ CA ký. Chứng chỉ CA là những gì tôi đang cung cấp cho load_verify_file(...).

Trả lời

0

Bạn đã chọn gọi một thao tác chặn cho đến khi nó hoàn thành hoặc không thành công, nó sẽ không làm như vậy, vì vậy nó sẽ chặn vĩnh viễn. Nếu bạn không muốn chặn miễn là hoạt động chắc chắn thành công hay thất bại, đừng gọi một thao tác được ghi chép cụ thể để thực hiện điều đó.

Nếu bạn đã đọc chặn trên kết nối mà đầu kia không bao giờ viết, bạn mong đợi điều gì sẽ xảy ra? Nó sẽ chặn mãi mãi. Ở đây, bạn đã thực hiện một cái bắt tay chặn trên một kết nối mà đầu kia sẽ không bao giờ bắt tay với bạn. Mã của bạn chờ cho đến khi nó hoạt động, giống như bạn đã yêu cầu.

Các vấn đề liên quan