我试图让我的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?
答案 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。