所以我试图修改第三方(libtorrent)只接受TLS 1.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);
然而,当我测试我与OpenSSL s_client的连接时,它仍然似乎接受tls 1.0和tls 1.1连接。
我做错了吗?
编辑:添加&#34; |提高:: ASIO :: SSL ::上下文:: no_tlsv1_1&#34;选项。我意识到我指的是一个旧的升压参考指南。但它并没有改变任何东西。
编辑:我刚才意识到我没有提到这个连接是双向/相互认证连接。不确定是否会改变任何内容。答案 0 :(得分:1)
这是在黑暗中的总镜头,但试试这个:
尝试创建特定于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连接是可接受的是未知的,但一个可能的解释是有一个默认的上下文宣传这个。这就是为什么他们提出了“适用于所有连接”的观点。
Here is a list TLS 1.2特定密码。
答案 1 :(得分:0)
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);