当前位置: 首页 > 知识库问答 >
问题:

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

嵇昱
2023-03-14

我试图让我的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,错误的版本号。当与TLS1.2客户端连接时,一切都很好。

如果在构造SSL上下文时,我将第二个参数从TLSV12_Server更改为TLSV11_Server,那么TLS1.1工作正常,但TLS1.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个答案

年嘉禧
2023-03-14

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

如果要使用多个协议,有一些特殊的方法,例如tls_server,它不指定版本,并启用TLS1.0、1.1和1.2。然后要禁用1.0,Boost::ASIO::SSL::Context::NO_TLSV1选项工作正常,只启用1.1和1.2。

 类似资料:
  • 我的测试程序从以下URL运行HTTP服务器:HTTP://www.herongyang.com/jdk/https-httpsechoer-better-https-server.html 请帮助如何使java只接受TLS1.2连接。

  • 我有一个很好用的Spring控制器: null

  • 我有一个蓝牙设备,用户可以通过它拍照。拍摄照片后,蓝牙设备将所有图像托管在自己的HTTP服务器(10.0.0.1)上,以便其他设备可以使用蓝牙连接到服务器,并使用服务器公开的REST API从服务器访问照片。 连接蓝牙设备(服务器)的步骤 进入设置,启用蓝牙 选择蓝牙设备 蓝牙设备设置(配对蓝牙设备) 选中Internet访问复选框。 通过这个我能够访问蓝牙服务器,但我的WiFi自动禁用,我无法访

  • 问题内容: 我有一个带有两个服务器端进程的程序。一台服务器只是将ArrayList发送给客户端。另一个服务器首先从客户端获取一个字符串,然后找到与该ID对应的正确记录,然后将记录发回。 我在第二个服务器进程中遇到问题。请参阅下面的println语句,其中显示“卡在此处”。那就是程序挂起的地方。 客户端: 问题答案: 您需要在两端的ObjectInputStream之前创建ObjectOutputS

  • 问题内容: 标题说了。 如果我尝试将ServerSocket和SSLServerSocket绑定到同一端口,则会收到错误消息。如果客户端尝试连接到没有SSL的SSLServerSocket,则accept()方法将引发错误。如果客户端尝试通过SSL连接到ServerSocket,我不知道如何建立安全连接。 可能吗? 问题答案: 您可以接受普通的套接字连接,并在以后使用(在服务器端)将其升级到SSL

  • 我有一个名为“Documents-MicroService”的Spring Boot微服务,它注册在Eureka服务器中。我试图使用URL中的名称并使用访问此微服务,如下所示: 虽然我确信服务名称在运行在8761端口上的Eureka服务器上可用(见下图),但我仍然得到以下错误: 错误: