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

时间:2017-11-03 13:00:15

标签: 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);

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

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

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

如果在构建SSL上下文时我将第二个参数从tlsv12_server更改为tlsv11_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?

1 个答案:

答案 0 :(得分:3)

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

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