2016-12-13 100 views
8

我正在使用TIdSSLIOHandlerSocketOpenSSL打開TLS/SSL連接。我目前想要支持1.0到1.2。如何確定在使用sslvSSLv23時協商哪個TLS/SSL協議?

我像這樣初始化IOHandler。

TIdSSLIOHandlerSocketOpenSSL(FSocket.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1]; 

建立連接後,如何獲得連接協商的協議? (兩者都用於確保客戶端和測試服務器的配置是正確的,並最終用於統計目的)。

我在連接後檢查了SSLContext.Method,但連接後仍然顯示sslvSSLv23SSLContext.SSLVersions顯示[sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1]

那麼我如何獲得這些信息呢?

回答

5

SSL/TLS會話建立後,特定的協商協議位於TIdSSLIOHandlerSocketOpenSSL.SSLSocket.Cipher.Version屬性中。 OpenSSL也有一個SSL_get_version()函數(Indy不使用,但可以直接調用)。

+0

'Cipher.Version'似乎不包含當前使用的協議(或者我嚴重缺少某些東西)。例如,如果我強制在客戶端上使用TLS1.1,則「Cipher.Version」將返回「TLSv1/SSLv3」。我將研究SSL_get_version。 –

+0

SSL_get_version的確給我提供了我正在尋找的信息。謝謝。 –

+0

@KenBourassa hmm,'SSL_CIPHER_get_version()'不是那種方式,但它看起來像[documentation](https://www.openssl.org/docs/manmaster/man3/SSL_CIPHER_get_version.html)已經改變自從我上次看到它以來,行爲顯然隨着時間而改變。在這種情況下,堅持使用'SSL_get_version()'。我可能會爲它整合一個新的屬性。 –