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;
}
어떤 이유가있을 수 있습니까? 내가 뭐 잘못하고 있니?
나는 그 preverification이 OpenSSL에 의해 행해졌다고 가정하기 때문에 verify_callback 핸들러를 제공하지 않는다. 거기에 어떤 단점이 있습니까 또는 영향을 수 < 1>?
이것은 사소한 것이지만 문제가 발생하지 않는지 확인하는 것입니다. 일반적으로 boost 예제에서는 ssl 컨텍스트 개체가
ssl::stream<tcp::socket>
의 ctor로 제공되기 전에 설정되었음을 보여줍니다. 나는 그러나 (위에 ctor에서) 그리고 나중에connect()
에서 속성을 변경하기 전에 그것을주고있다. 이러한 것들이 생성 된 ssl :: stream의 동작에 반영 될 것인가? (참조에 의해 소요되고 어떤 복사본도 만들지 않기를 희망하기 때문에)?
(유용 할 경우) CA 루트 키, CA 자체 서명 PEM 인증서, CA 인증서로 서명 된 서버 인증서를 만들었습니다. CA 인증서는 내가 load_verify_file(...)
에게주고있는 것입니다.