Как определить, какой протокол TLS/SSL был согласован при использовании sslvSSLv23?

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

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

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

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

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

Итак, как мне получить эту информацию?


person Ken Bourassa    schedule 13.12.2016    source источник


Ответы (1)


Конкретный согласованный протокол находится в свойстве TIdSSLIOHandlerSocketOpenSSL.SSLSocket.Cipher.Version после установки сеанса SSL/TLS. OpenSSL также имеет функцию SSL_get_version() (которую Indy не использует, но вы можете вызвать ее напрямую).

person Remy Lebeau    schedule 13.12.2016
comment
Cipher.Version, похоже, не содержит текущий используемый протокол (или я что-то серьезно упустил). Если, например, я принудительно использую на клиенте только TLS1.1, Cipher.Version возвращает «TLSv1/SSLv3». Я собираюсь изучить SSL_get_version. - person Ken Bourassa; 13.12.2016
comment
SSL_get_version дал мне информацию, которую я искал. Спасибо. - person Ken Bourassa; 14.12.2016
comment
@KenBourassa хм, SSL_CIPHER_get_version() раньше так не было, но похоже на документация изменилась с тех пор, как я видел ее в последний раз, так что поведение явно изменилось со временем. В этом случае придерживайтесь SSL_get_version(). Я мог бы интегрировать новое свойство для него. - person Remy Lebeau; 14.12.2016