2016-05-31 42 views
4

我正在開發SSL-Cipher-Scanner。這意味着我指定了主機和端口,我的程序告訴我主機接受哪些密碼。在打開的連接上更改密碼

我目前的版本可以正常工作,但速度很慢(每個主機約20到30秒),因爲我爲每個密碼開啓了一個新的連接。

我用下面的方法(按照這個順序):

ssl_ctx = SSL_CTX_new(method); 
bio = BIO_new_ssl_connect(ssl_ctx); 
BIO_set_conn_port(bio, port); 
BIO_set_conn_hostname(bio, host); 
BIO_get_ssl(bio, &ssl); 
SSL_set_cipher_list(ssl, cipher); 
BIO_do_connect(bio); 
BIO_do_handshake(bio); 

我現在想只是重新設置cipherlist做一套握手,而不是重新連接的。在wireshark中,我看到它實際上使用更改密碼規範協議,但服務器返回了加密的警報(所以我不能告訴你它是哪一個)。的

SSL_set_cipher_list(ssl, cipher); 

BIO_do_handshake(bio); 

的返回值都是1,所以它應該是成功的。

任何人都可以請幫助我如何更改打開的連接上使用的密碼?

一些額外的信息:我用的OpenSSL版本1.0.2h

+0

簽出[sslscan](http://sourceforge.net/projects/sslscan/)的源代碼。它大多使用OpenSSL做同樣的事情,但在工作流程中的不同時間比嘗試。原來的項目在一段時間之前就被放棄了,但GitHub上有很多現代化的分支。 – jww

+0

該警報是在舊的密碼套件中加密的,因此您應該能夠看到它是什麼。它還表明該服務器不支持所要求的新密碼套件。 – EJP

回答

3

你在做什麼是非常相似的一個renegotiation DOS attack。服務器對可以完成多少次重新談判存在限制並不少見。在初始TLS握手之後,通常不允許或僅允許一次重新協商,以抵禦此類DOS攻擊。

+0

好的,謝謝你的回答!對於我如何解決這個問題,你有什麼建議嗎?我的意思是sslyze工具可以在同一臺服務器上大約5-8秒內完成掃描,並且還有額外的python開銷。 – Drilexus

+2

@Drilexus:以'ALL'密碼開始,然後刪除所有成功的密碼。 I.E.如果你第一個'AES-128',那麼你的下一個密碼集是'ALL:!AES-128'。一旦連接失敗,你就知道所有相關的密碼都被檢查過了。 –

+0

不錯的主意,謝謝! – Drilexus