我正在使用 example from boost具有三个细微差别:
- 我使用线程来处理
io_service
- 我已将协议(protocol)限制为
> TLS v1.1
- 没有密码回调,因为证书 key 没有密码
线程简单地并行处理各种连接
void server::start()
{
for (std::size_t i = 0; i < thread_pool_size_; i++) {
threads_.push_back(std::thread([&]() {
io_service_.run();
}));
}
for (auto & t : threads_) {
t.join();
}
}
上下文参数是:
ctx.set_options(boost::asio::ssl::context::default_workarounds
|boost::asio::ssl::context::no_sslv2
|boost::asio::ssl::context::no_sslv3
|boost::asio::ssl::context::no_tlsv1
|boost::asio::ssl::context::no_tlsv1_1
|boost::asio::ssl::context::single_dh_use);
除此之外,一个connection
类在内部控制一个ssl_socket
,
它遵循以下回调链:
构造函数
-> 开始
-> async_handshake
-> 读头
-> async_read_until
-> process_header
...
如果我用明文套接字 ip::tcp::socket
替换 SSL 套接字,那么一切正常。
使用 SSL 套接字时,我总是调用了一个你不应该调用的函数
。
GDB 显示这源自 async_handshake
。看完this SO post我设法获取了错误代码:
(20,197,66) 错误:140C5042:SSL 例程:ssl_undefined_function:调用了您不应调用的函数
。
我在 Ubuntu 16.04 上使用 Boost 1.58。 关于为什么会发生这种情况、可能导致这种情况的原因或我可能做错了什么的任何帮助?
如果重要的话,我正在使用 -insecure
标志对 curl
进行测试。
编辑
没有尝试使用限制性协议(protocol)标志,并通过设置密码回调 - 问题仍然存在。
最佳答案
似乎是以下行触发了问题:
context_(io_service, boost::asio::ssl::context::tlsv12_client)
我应该多注意我的代码(复制粘贴是万恶之源):
有问题的行在 context
构造函数中:
ctx_(io_service, boost::asio::ssl::context::tlsv12_client)
我已经用 server
版本替换了:
context_(io_service, boost::asio::ssl::context::tlsv12_server)
full list is hidden在boost的实现头文件中。 在这里插入大脸掌 :-)
关于c++ - boost asio SSL 服务器错误 : called a function you should not call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47579409/