2015-06-23 203 views
2

所以我想修改第三方(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

回答

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

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提出了「適用於所有連接」的觀點。

Here is a list TLS 1.2特定密碼。