2016-12-13 1 views
8

J'utilise TIdSSLIOHandlerSocketOpenSSL pour ouvrir une connexion TLS/SSL. Je veux actuellement supporter tls 1.0 à 1.2.Comment déterminer quel protocole TLS/SSL a été négocié lors de l'utilisation de sslvSSLv23?

J'initialise le IOHandler comme ceci.

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

Une fois la connexion est faite, comment puis-je le protocole a été négocié pour la connexion? (Les deux pour assurer la configuration du client et du serveur de test est correcte, et éventuellement à des fins de statistiques).

J'ai vérifié SSLContext.Method après la connexion, mais il montre toujours sslvSSLv23 après la connexion. SSLContext.SSLVersions montre [sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1].

Alors, comment puis-je obtenir cette information?

Répondre

5

Le protocole négocié spécifique se trouve dans la propriété TIdSSLIOHandlerSocketOpenSSL.SSLSocket.Cipher.Version après l'établissement de la session SSL/TLS. OpenSSL a aussi une fonction SSL_get_version() (que Indy n'utilise pas, mais vous pouvez appeler directement).

+0

'Cipher.Version' ne semble pas contenir le protocole en cours d'utilisation (ou je manque sérieusement quelque chose). Si, par exemple, je force à utiliser uniquement TLS1.1 sur le client, 'Cipher.Version' renvoie 'TLSv1/SSLv3'. Je vais regarder dans SSL_get_version. –

+0

SSL_get_version m'a donné l'information que je cherchais. Merci. –

+0

@KenBourassa hmm, 'SSL_CIPHER_get_version()' n'a pas l'habitude d'être ainsi, mais il semble que la [documentation] (https://www.openssl.org/docs/manmaster/man3/SSL_CIPHER_get_version.html) a changé depuis que je l'ai vu pour la dernière fois, le comportement a apparemment changé avec le temps. Dans ce cas, respectez 'SSL_get_version()'. Je pourrais intégrer une nouvelle propriété pour cela. –