Używam TIdSSLIOHandlerSocketOpenSSL do otwierania połączenia TLS/SSL. Obecnie chcę obsługiwać tls od 1.0 do 1.2.Jak ustalić, który protokół TLS/SSL został wynegocjowany podczas korzystania z sslvSSLv23?
Inicjuję IOHandler w ten sposób.
TIdSSLIOHandlerSocketOpenSSL(FSocket.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1];
Po nawiązaniu połączenia, w jaki sposób mogę ustalić, który protokół został wynegocjowany dla połączenia? (Zarówno w celu zapewnienia konfiguracji zarówno klienta, jak i serwera testowego jest poprawne, a docelowo w celach statystycznych).
Po połączeniu sprawdziłem SSLContext.Method
, ale po połączeniu nadal widać sslvSSLv23
. SSLContext.SSLVersions
pokazuje [sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1]
.
Jak mogę uzyskać te informacje?
'Cipher.Version' nie zawiera aktualnie używanego protokołu (albo coś bardzo mi brakuje). Jeśli, na przykład, wymuszam używanie tylko TLS1.1 na kliencie, 'Cipher.Version' zwraca 'TLSv1/SSLv3'. Zajrzę do SSL_get_version. –
SSL_get_version dało mi informacje, których szukałem. Dzięki. –
@KenBourassa hmm, 'SSL_CIPHER_get_version()' nie był kiedyś taki, ale wygląda na to, że zmieniła się [dokumentacja] (https://www.openssl.org/docs/manmaster/man3/SSL_CIPHER_get_version.html) odkąd ostatni raz to widziałem, więc zachowanie najwyraźniej zmieniło się z czasem. W takim przypadku trzymaj się 'SSL_get_version()'. Mogę zintegrować z nią nową właściwość. –