Boost Asio SSL握手永远不会返回
Boost Asio SSL handshake never returns
类似问题
我的情况不同。我已经使用boost::asio::ssl
编写了一个SSL客户端,但目前没有服务器可以测试,因为它是由其他小组开发的。因此,当前服务器只接受普通TCP(不安全)连接。当我对服务器使用ssl客户端时,阻塞handshake()
挂起/永远不会返回。我在网上搜索了一下,发现Mozilla也有类似的问题——当启动SSL连接到一个不支持SSL的服务器时,它会挂起,但是他们的错误已经修复了。我将对部分代码进行解释,以确保没有编码错误:
in 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;
}
原因是什么?我做错什么了吗?
我不提供任何verify_callback处理程序,因为我假设由OpenSSL完成的预验证(因为在boost中到处都说它正在调用OpenSSL等效函数)应该足够了。这有什么不利之处吗?或者这会影响到我们吗?
这是一个微不足道的,但只是为了确保它不会引起问题:通常在boost中的示例显示ssl上下文对象在
ssl::stream<tcp::socket>
的ctor中给出之前已经设置。然而,我在之前(在上面的角色中)给出它,然后在connect()
中更改属性。这些会反映在构造ssl::流的行为(因为它需要引用,我希望它不做任何副本)?
在一个侧面说明(如果它是有用的),我创建了一个CA rootKey, CA自签名PEM证书,由CA证书签名的服务器证书。CA证书是我给load_verify_file(...)
的。
您选择调用一个阻塞直到完成或失败的操作,它两者都不阻塞,因此它永远阻塞。如果你不想在操作确定成功或失败的时间内阻塞,那么就不要调用专门为此编写文档的操作。
如果你在一个连接上阻塞读,而另一端从来没有写过,你会期望发生什么?它会永远阻塞。在这里,你在一个连接上做了一个阻塞握手,另一端永远不会与你握手。您的代码等待,直到它完成,就像您要求的那样。
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- cudaMemcpyToSymbol只是挂起,永远不会返回.GPU 处理速度为 100%.代码在 K40 上工作正常,但
- 无法从串行端口读取.WaitCommEvent() 永远不会返回
- 程序返回-1073741571而不是永远进行的值
- OpenRAVE ControllerBase 在 IsDone() 方法处阻塞并且永远不会返回
- LoadLibrary 永远不会在 Visual Studio 2013 c++ 项目中返回
- 如果发送进程停止,boost::interprocess::timed_received()永远不会返回
- CoCreateInstance() 永远不会返回
- 为什么这个对isspace()的调用永远不会返回true
- 对 Boost JSON 解析器的调用永远不会返回
- 为什么 ReadFile() 不返回 0 ?程序尝试永远从管道读取数据
- waveOutWrite 缓冲区永远不会返回到应用程序
- Poco C++ 1.4.3p1 的 DatagramSocket ReceiveBytes() 永远不会返回。我是否滥用了该功能?
- 为什么从 write() 调用 __kernel_vsyscall() 永远不会返回
- ICLRuntimeHost Start方法永远不会返回
- 为什么eof()永远不会返回true
- io_service::run() 永远不会返回
- 如何永远从"ACE_Reactor::instance()->run_reactor_event_loop();"街区返回?
- Winapi定时器回调线程,永远不会返回
- Boost read()永远不会返回,即使在服务器上执行写(ssl) Boost