不能只接受TLS 1.2和boost :: asio?

问题描述:

所以我想修改第三方(libtorrent)只接受TLS 1.2协议。 SSL环境的设置的不能只接受TLS 1.2和boost :: asio?

部分:

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.First似乎仍然接受TLS 1.0和TLS 1.1连接。

有什么我做错了吗?

编辑:添加 “|的boost ::支持ASIO :: SSL ::背景:: no_tlsv1_1” 来选择。我意识到我指的是一个旧的助力参考指南。但它没有改变任何东西。

编辑:我只知道,我还没有提到,这个连接是双向/双向认证连接。不知道这是否会改变任何事情。

+0

您需要展示更多代码。具体来说,您如何确保您的ctx适用于所有连接 – sehe

+0

我不知道如何向您展示这是一个好方法。但让我们假设这适用于所有连接,这个代码是否正确? – jimmy

+0

我这么认为。关键是,除了这个,甚至开始思考的东西都可能是错误的。看[没有人再写测试用例](http://kera.name/articles/2013/10/nobody-writes-testcases-any-more/)。把它变成一个SSCCE,你可能会自己发现问题。否则,我们在这里交叉检查 – sehe

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); 
+1

由于1.58的提升,实际上有TLS1.2常量http://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/reference/ssl__context.html – jimmy

+0

@jimmy好注意,谢谢。 – PSIAlt

这是一个在黑暗中总射门,但试试这个:

尝试创建针对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连接都将失败,并显示“无共享密码”错误。

至于为什么你的服务器连广告也非1.2的连接是可以接受的是未知的,但一个可能的解释是,是,是广告这是一个默认的上下文。这就是为什么sehe提出了“适用于所有连接”的观点。

Here is a list TLS 1.2特定密码。