2016-12-13 14 views
8

Tôi đang sử dụng TIdSSLIOHandlerSocketOpenSSL để mở kết nối TLS/SSL. Tôi hiện đang muốn hỗ trợ tls 1.0 đến 1.2.Làm cách nào để xác định giao thức TLS/SSL nào đã được thương lượng khi sử dụng sslvSSLv23?

Tôi khởi tạo IOHandler như thế này.

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

Sau khi kết nối được thực hiện, làm cách nào tôi có thể nhận được giao thức nào được thương lượng cho kết nối? (Cả hai để đảm bảo cấu hình của cả máy khách và máy chủ thử nghiệm là chính xác, và cuối cùng cho mục đích thống kê).

Tôi đã kiểm tra SSLContext.Method sau khi kết nối nhưng vẫn hiển thị sslvSSLv23 sau khi kết nối. SSLContext.SSLVersions hiển thị [sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1].

Vậy làm cách nào để nhận thông tin đó?

Trả lời

5

Giao thức được thương lượng cụ thể nằm trong thuộc tính TIdSSLIOHandlerSocketOpenSSL.SSLSocket.Cipher.Version sau khi phiên SSL/TLS được thiết lập. OpenSSL cũng có chức năng SSL_get_version() (mà Indy không sử dụng, nhưng bạn có thể gọi trực tiếp).

+0

'Cipher.Version' dường như không chứa giao thức hiện tại đang được sử dụng (Hoặc tôi đang thiếu một số thứ nghiêm trọng). Ví dụ, nếu tôi chỉ sử dụng TLS1.1 trên máy khách, 'Cipher.Version' trả về 'TLSv1/SSLv3'. Tôi sẽ xem xét SSL_get_version. –

+0

SSL_get_version đã cung cấp cho tôi thông tin mà tôi đang tìm kiếm. Cảm ơn. –

+0

@KenBourassa hmm, 'SSL_CIPHER_get_version()' không được sử dụng theo cách đó, nhưng có vẻ như [tài liệu] (https://www.openssl.org/docs/manmaster/man3/SSL_CIPHER_get_version.html) đã thay đổi kể từ lần cuối tôi nhìn thấy nó, vì vậy hành vi dường như đã thay đổi theo thời gian. Trong trường hợp đó, hãy gắn bó với 'SSL_get_version()'. Tôi có thể tích hợp một tài sản mới cho nó. –

Các vấn đề liên quan