我的情况不同。我已经编写了一个 SSL 客户端,boost::asio::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;
}
可能是什么原因?我做错什么了吗?
我没有提供任何 verify_callback 处理程序,因为我假设 OpenSSL 完成的预验证(因为在 boost 中到处都说它正在调用 OpenSSL 等效函数)应该足够了。它有什么缺点吗?或者这会影响<1>吗?
这是一个微不足道的问题,但只是为了确保它不会引起问题:通常 boost 中的示例表明 ssl 上下文对象在 ctor of 中提供之前已设置
ssl::stream<tcp::socket>
。但是,我在之前(在上面的 ctor 中)给出它,然后在connect()
. 这些是否会反映在构造的 ssl::stream 的行为中(因为它通过引用获取,我希望它不会复制)?
附带说明(如果有用的话),我创建了一个 CA rootKey、CA 自签名 PEM 证书、由 CA 证书签名的服务器证书。CA 证书是我给的load_verify_file(...)
。