2

所以我试图修改第三方(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 连接。

有什么我做错了吗?

编辑:在选项中添加了“| boost::asio::ssl::context::no_tlsv1_1”。我意识到我指的是旧的 bo​​ost 参考指南。然而它并没有改变任何东西。

编辑:我只是意识到我没有提到这个连接是双向/相互身份验证连接。不确定这是否会改变任何事情。

4

2 回答 2

1

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);
于 2015-06-24T07:14:06.973 回答
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 连接都将失败,并出现错误“无共享密码”。

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

这是TLS 1.2 特定密码的列表。

于 2015-06-25T07:47:10.860 回答