C++ Boost Asio SSL握手永不返回
我的情况不同。我已经使用C++ Boost Asio SSL握手永不返回,c++,boost,ssl,c++11,boost-asio,C++,Boost,Ssl,C++11,Boost Asio,我的情况不同。我已经使用boost::asio::SSL编写了一个SSL客户机,但目前还没有服务器可供测试,因为其他团队正在开发它。因此,当前服务器只接受普通TCP(不安全)连接。当我对服务器使用ssl客户端时,阻塞handshake()挂起/永远不会返回。我在网上搜索过,发现Mozilla也有类似的问题——它在启动到非SSL支持服务器的SSL连接时挂起,但它们的错误是固定的。我只对部分代码进行解释,以确保没有编码错误: 在ctor中: SecuredConnectionPolicy<Th
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>
{
}
ssl::stream
的ctor中给出ssl上下文对象之前,已经设置了它。但是,我之前(在上面的ctor中)给出了它,之后在connect()
中更改了属性。这些会反映在构造的ssl::stream的行为中吗(因为它是通过引用获取的,我希望它不会复制任何副本)顺便说一句(如果有用的话),我创建了一个CA根密钥、CA自签名PEM证书、由CA证书签名的服务器证书。CA证书是我提供给加载验证文件(…)的内容。如果您选择调用一个阻止操作,直到它完成或失败,那么这两个操作都不会,所以它将永远阻止。如果您不想阻止操作的成功或失败,请不要调用专门记录的操作 如果您在另一端从未进行过写入的连接上执行了阻塞读取,您希望发生什么?它会永远阻塞。在这里,您在一个连接上进行了阻塞握手,而另一端永远不会与您握手。您的代码会等待,直到它按照您的要求执行为止
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;
}