2016-12-13 21 views
8

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?

Odpowiedz

5

Określony wynegocjowany protokół znajduje się w właściwości TIdSSLIOHandlerSocketOpenSSL.SSLSocket.Cipher.Version po ustanowieniu sesji SSL/TLS. OpenSSL ma również funkcję SSL_get_version() (której Indy nie używa, ale możesz zadzwonić bezpośrednio).

+0

'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. –

+0

SSL_get_version dało mi informacje, których szukałem. Dzięki. –

+0

@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ść. –

Powiązane problemy