2016-12-13 19 views
8

TLS/SSL bağlantısını açmak için TIdSSLIOHandlerSocketOpenSSL kullanıyorum. Şu anda tls 1.0 ila 1.2'yi desteklemek istiyorum. IOHandler'i böyle başlatıyorum.sslvSSLv23 kullanırken hangi TLS/SSL protokolünün nasıl anlaşıldığı belirlenir?

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

Bağlantı kurulduktan sonra, bağlantı için hangi protokolün görüşüleceğini nasıl alabilirim? (Hem istemci hem de test sunucusunun yapılandırmasını sağlamak için her ikisi de doğru ve sonuç olarak istatistik amacı için).

Bağlantıdan sonra SSLContext.Method'u kontrol ettim, ancak bağlantıdan sonra hala sslvSSLv23'u gösterir. SSLContext.SSLVersions, [sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1]'u gösterir.

Peki bu bilgileri nasıl alabilirim?

cevap

5

SSL/TLS oturumu oluşturulduktan sonra, belirli anlaşmalı protokol TIdSSLIOHandlerSocketOpenSSL.SSLSocket.Cipher.Version özelliğindedir. OpenSSL ayrıca bir SSL_get_version() işlevine sahiptir (Indy kullanmaz, ancak doğrudan arayabilirsiniz).

+0

'Cipher.Version', kullanılan geçerli protokolü içermiyor gibi görünmüyor (Ya da ciddi bir şey eksik). Örneğin, istemcide sadece TLS1.1 kullanarak zorlarsam, 'Cipher.Version' 'TLSv1/SSLv3' değerini döndürür. SSL_get_version'a bakacağım. –

+0

SSL_get_version aradığım bilgiyi bana verdi. Teşekkürler. –

+0

@KenBourassa hmm, 'SSL_CIPHER_get_version()' bu şekilde kullanılmadı, ancak [belgeler] (https://www.openssl.org/docs/manmaster/man3/SSL_CIPHER_get_version.html) değişmiş gibi görünüyor En son gördüğümden beri, davranış zamanla değişti. Bu durumda, SSL_get_version() 'ile yapıştırın. Bunun için yeni bir mülk entegre edebilirim. –

İlgili konular