我的案子不一样。我使用boost::asio::ssl
编写了一个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;
}
ssl::stream<tcp::socket>
的ctor中给出它之前,已经设置了ssl上下文对象。不过,我将在此之前(在上面的ctor中)提供它,然后在connect()
中更改属性。这些是否反映在构建的ssl::stream的行为中(因为它是引用的,我希望它不会复制任何副本)?在附带说明(如果有用的话),我创建了一个CA rootKey、CA自签名的PEM证书、由CA证书签名的服务器证书。CA证书是我给load_verify_file(...)
的证书。
发布于 2013-03-12 21:50:07
您选择调用一个操作,直到它完成或失败为止,它都不会,所以它会永远阻塞。如果您不想阻塞操作,只要操作确实成功或失败,就不要调用专门记录下来的操作。
如果在另一端从未写过的连接上执行阻塞读取,那么您会期望发生什么呢?就会被永远封死。在这里,您已经在另一端永远不会与您握手的连接上进行了阻塞握手。正如您所要求的那样,您的代码一直等到它运行。
https://stackoverflow.com/questions/15354737
复制相似问题