提升asio SSL服务器错误:调用一个你不应该调用的函数

时间:2017-11-30 17:36:27

标签: c++ sockets ssl boost boost-asio

我使用的example from boost有三个小的差别:

  1. 我使用线程来处理io_service
  2. 我已将协议限制为> TLS v1.1
  3. 没有密码回调,因为证书密钥没有密码
  4. 线程简单地并行处理各种连接

    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, 它遵循以下回调链:

    ctor -> start -> async_handshake -> read_header -> async_read_until -> process_header ...

    如果我用明文套接字ip::tcp::socket替换SSL套接字,那么一切正常。 使用SSL套接字时,我不断获得called a function you should not call

    GDB显示这来自async_handshake。阅读this SO post后,我设法获取了错误代码:

    (20,197,66) error:140C5042:SSL routines:ssl_undefined_function:called a function you should not call

    我在Ubuntu 16.04上使用Boost 1.58。 关于为什么会发生这种情况,可能导致它的原因,或者我可能做错了什么的任何帮助?

    如果重要,我正在使用curl标记-insecure进行测试。

    修改

    尝试没有限制性协议标志,并通过设置密码回调 - 问题仍然存在。

1 个答案:

答案 0 :(得分:1)

似乎以下行触发了问题:

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)

boost的实现标头中的full list is hidden。 在这里插入 big facepalm : - )