2016-12-13 27 views
8

Я использую TIdSSLIOHandlerSocketOpenSSL, чтобы открыть соединение TLS/SSL. В настоящее время я хочу поддерживать tls 1.0 до 1.2.Как определить, какой протокол TLS/SSL был согласован при использовании sslvSSLv23?

Я инициализирую IOHandler следующим образом.

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

После установления соединения, как я могу узнать, какой протокол был согласован для подключения? (И для обеспечения правильной конфигурации клиентского и тестового серверов, и в конечном итоге для целей статистики).

Я установил SSLContext.Method после подключения, но он все еще показывает sslvSSLv23 после подключения. SSLContext.SSLVersions показаны [sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1].

Как я могу получить эту информацию?

ответ

5

Конкретный согласованный протокол находится в собственности TIdSSLIOHandlerSocketOpenSSL.SSLSocket.Cipher.Version после установления сеанса SSL/TLS. 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()' не так привык, но похоже, что [документация] (https://www.openssl.org/docs/manmaster/man3/SSL_CIPHER_get_version.html) изменилась поскольку я в последний раз видел это, поэтому поведение, по-видимому, со временем изменилось. В этом случае придерживайтесь 'SSL_get_version()'. Я мог бы интегрировать в него новое свойство. –