2014-05-17 23 views
4

繼真的過時的教程中,我成功地創建使用OpenSSL與TLS1.2 HTTPS服務器,我很驕傲;)的OpenSSL讓服務器和客戶端協商方法

但是TLS 1.2只在最新的瀏覽器中支持,我想在客戶端和服務器之間進行某種協議的協商,我確信它可以完成,但我無法找到它!所以如果客戶端只支持TLS1.0,那就使用它。如果它只支持SSLv3,請使用它。不知道的SSLv2,也許更好的留下...

我現在使用的代碼是:

SSL_library_init(); 
OpenSSL_add_all_algorithms(); 
SSL_load_error_strings(); 
ssl_method = TLSv1_2_server_method(); 
ssl_ctx = SSL_CTX_new(ssl_method); 

然後將服務器證書加載和ssl_ctx的所有連接共享。當客戶端是accept版服務器套接字它被封裝在一個SSL對象(無論它代表):

ssl = SSL_new(ssl_ctx); 
SSL_set_fd(ssl, client_socket); 
SSL_accept(ssl); 

所以我想有什麼東西在SSL_CTX創造改變,讓更多的方法...任何想法?

<rant>沒有體面的,廣泛的文檔可以找到OpenSSL,最好的可用是一個10歲的教程! </rant >

在此先感謝。

+0

「沒有體面的,廣泛的文檔可以找到OpenSSL ......」 - 是的,文檔吸吮在時間。但是您應該從OpenSSL wiki中查看[SSL/TLS Client](http://wiki.openssl.org/index.php/SSL/TLS_Client)。 – jww

回答

10

您可以通過使用SSLv23_method()(和朋友)而不是特定的方法(例如您的示例中的TLSv1_2_server_method())來完成此操作。這發送SSLv2 ClientHello,但也指定支持的最高協議。有些過時man page說:

SSLv23_method(void), SSLv23_server_method(void), SSLv23_client_method(void)

一個TLS/SSL使用這些方法建立的連接就會明白 的的SSLv2,SSLv3的,和的TLSv1協議。客戶端將發送SSLv2 客戶端問候消息,並指出它也可以理解SSLv3 和TLSv1。服務器將瞭解SSLv2,SSLv3和TLSv1客戶端 hello消息。當兼容性是 的問題時,這是最好的選擇。

這個在線手冊頁不討論新TLSv1_1和TLSv1_2協議,但我的s23_clnt.c的1.0.1g來源,SSLv23_method()包括他們驗證。

然後,您可以限制協議,你實際上SSL_CTX_set_options()接受:

可用協議的列表可以在以後使用 SSL_OP_NO_SSLv2,SSL_OP_NO_SSLv3)的 的SSL_CTX_set_options的SSL_OP_NO_TLSv1選項(或SSL_set_options()函數的限制。使用這些 選項可以選擇例如SSLv23_server_method()和 能夠與所有可能的客戶端進行協商,但僅允許較新的 協議,如SSLv3或TLSv1。

但是,請注意,您無法啓用任意套協議,只能在SSLv2,SSLv3,TLSv1,TLSv1_1,TLSv1_2中使用連續協議。例如,您不能僅選擇SSLv3和TLSv1_1,而忽略TLSv1。源此評論解釋了原因:

SSL_OP_NO_X禁用上面X 所有協議,如果有一些協議下方支持X。爲了保持「版本能力」向量連續,這是必需的。因此,如果應用程序想要禁用TLS1.0以支持TLS1> = 1,則不足以通過SSL_NO_TLSv1,回答爲SSL_OP_NO_TLSv1 | SSL_OP_NO_SSLv3 | SSL_OP_NO_SSLv2。

+0

如果禁用了SSLv2,'SSLv23_client_method()'不會發送SSLv2 ClientHello消息。 https://github.com/openssl/openssl/commit/c6c2e3135dd6cff21bb4cd05a3891b5fdde04977 –