如何让 Boost::asio SSL 服务器同时接受 TLS 1.1 和 TLS 1.2?

Ged*_*tis 3 c++ ssl boost openssl boost-asio

我试图让我的 SSL 服务器同时支持 TLS 1.1 和 TLS 1.2,但不支持早期版本。

这是我配置 SSL 上下文的方式:

// Here io is an instance of io_service
boost::asio::ssl::context ctx(io, boost::asio::ssl::context::tlsv12_server);

ctx.use_certificate_chain_file("./certs.pem");
ctx.use_private_key_file("./key.pem", ssl::context::pem);

SSL_CTX_set_cipher_list(ctx.native_handle(), "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS");

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::single_dh_use
                | SSL_OP_CIPHER_SERVER_PREFERENCE);

ctx.clear_options(boost::asio::ssl::context::no_tlsv1_1);

// Creating socket:
using ssl_socket = boost::asio::ssl::stream<boost::asio::ip::tcp::socket>;
auto sock = std::make_unique<ssl_socket>(io, ctx);
Run Code Online (Sandbox Code Playgroud)

我什至试图清除该no_tlsv1_1选项,如果它以某种方式被默认设置。即使我将配置减少到:

ctx.use_certificate_chain_file("./certs.pem");
ctx.use_private_key_file("./key.pem", ssl::context::pem);
Run Code Online (Sandbox Code Playgroud)

尝试与 TLS 1.1 客户端连接时,async_handshake回调仍会给出错误代码asio.ssl:336109835, wrong version number。与 TLS 1.2 客户端连接时,一切正常。

如果构建SSL背景下,当我从改变的第二个参数tlsv12_servertlsv11_server然后TLS 1.1的作品不错,但TLS 1.2变为不可用。

我已经尝试过 Boost 版本 1.54 和 1.65.1 以及 openssl 版本 1.0.2g 和 1.0.2l,似乎都是这种情况。运行 Linux Mint 18.2

我应该怎么做才能同时使用 TLS 1.1 和 TLS 1.2?

Ged*_*tis 9

我设法自己弄明白了。tlsv12_server我在构造上下文时传入的方法不是支持的最大或最小版本,该方法是将使用的确切协议

如果你想使用多个协议,有一些特殊的方法,例如tls_server,它不指定版本并启用 TLS 1.0、1.1 和 1.2。然后禁用 1.0,该boost::asio::ssl::context::no_tlsv1选项工作正常,只启用 1.1 和 1.2。