Ssl 不可能只接受带有boost::asio的TLS 1.2?

Ssl 不可能只接受带有boost::asio的TLS 1.2?,ssl,openssl,boost-asio,libtorrent,Ssl,Openssl,Boost Asio,Libtorrent,因此,我试图修改第三方(libtorrent)以仅接受TLS1.2协议 SSL上下文设置的一部分: boost::shared_ptr<context> ctx = boost::make_shared<context>(boost::ref(m_ses.get_io_service()), context::tlsv12) ctx->set_options(context::default_workarounds | boost::asio::s

因此,我试图修改第三方(libtorrent)以仅接受TLS1.2协议

SSL上下文设置的一部分:

boost::shared_ptr<context> ctx = boost::make_shared<context>(boost::ref(m_ses.get_io_service()), context::tlsv12)

ctx->set_options(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);
boost::shared_ptr ctx=boost::make_shared(boost::ref(m_ses.get_io_service()),context::tlsv12)
ctx->设置选项(上下文::默认\u解决方案
|boost::asio::ssl::context::no\u sslv2
|boost::asio::ssl::context::no\u sslv3
|boost::asio::ssl::context::no\u tlsv1
|boost::asio::ssl::context::no\u tlsv1\u 1
|boost::asio::ssl::context::single_dh_use);
然而,当我测试与OpenSSL s_客户端的连接时,它似乎仍然接受tls 1.0和tls 1.1连接

我做错什么了吗

编辑:在选项中添加“| boost::asio::ssl::context::no_tlsv1_1”。我意识到我指的是一本旧的boost参考指南。然而,这并没有改变任何事情


编辑:我只是意识到我没有提到此连接是双向/相互身份验证连接。不确定这是否改变了什么。

asio::ssl::context中没有TLS1.2的常量。但您可以使用本机openssl API来实现这一点:

#include <openssl/ssl.h>
long ssl_disallowed = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2;
ssl_disallowed &= ~SSL_OP_NO_TLSv1_2;
SSL_CTX_set_options(ctx.native_handle(), ssl_disallowed);
#包括
长ssl不允许=ssl_OP_NO_SSLv2 | ssl_OP_NO_SSLv3 | ssl_OP_NO_TLSv1 | ssl_OP_NO_TLSv1 | ssl_OP_NO_TLSv1 | 2;
不允许使用ssl&=~ssl\u操作\u否\u TLSv1\u 2;
SSL_CTX_set_选项(CTX.native_handle(),不允许SSL_);

这是在黑暗中拍摄的完整照片,但请尝试以下方法:

尝试创建特定于TLS 1.2的密码字符串,然后调用

char* TLS_12_CIPHERS = "... list of ciphers specific to TLS 1.2";
SSL_CTX_set_cipher_list(ctx->native_handle(), TLS_12_CIPHERS);
然后在上下文(假设它是服务器上下文)上设置选项,服务器可以选择它想要使用的密码,而不是客户端

SSL_CTX_set_options(ctx->native_handle(), SSL_OP_CIPHER_SERVER_PREFERENCE);
您可能认为boost::asio::ssl可以通过指定no_X选项来为您解决这些问题,但我不能确定。正如我所说的,这是一个偶然的机会,但是以这种方式使用OpenSSL API显式地配置上下文应该强制执行您所追求的条件。即使在某个地方,不知何故,某个冲突选项被设置为允许非TLS 1.2连接,使用这些选项,任何非TLS 1.2连接都将失败,并出现错误“no shared cipher”

至于您的服务器为什么会宣传非1.2连接是可接受的,这一点尚不清楚,但一种可能的解释是,有一个默认上下文在宣传这一点。这就是为什么他提出了“适用于所有连接”的观点


TLS 1.2的特定密码。

您需要显示更多代码。具体来说,您如何确保您的ctx应用于所有连接我不确定如何以良好的方式向您展示这一点。但我们假设这适用于所有连接,这段代码正确吗?我想是的。关键是,除了这一点,还有太多的事情是错误的,甚至连开始思考都不行。看见将其制作成SSCCE,您可能会自己发现问题。否则,我们在这里交叉核对我想这将是我的下一步。我希望不必深入第三方库;)首先,您可能想试试:(您发布的链接是一个非常陈旧的镜像)。其次,您可能希望使用SSL测试boost.asio的示例程序,看看是否可以让这些程序只接受TLS1.2,因为boost 1.58 TLS1.2实际上有常量