2016-12-13 26 views
8

TIdSSLIOHandlerSocketOpenSSL을 사용하여 TLS/SSL 연결을 엽니 다. 나는 현재 1.0에서 1.2까지의 tls를 지원하고자한다.sslvSSLv23을 사용할 때 협상 된 TLS/SSL 프로토콜을 확인하는 방법은 무엇입니까?

이렇게 IOHandler를 초기화합니다.

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

연결이 완료되면 어떻게 연결을 위해 협상 된 프로토콜을 얻을 수 있습니까? (클라이언트와 테스트 서버의 구성을 모두 보장하기 위해, 그리고 결국 통계 목적으로).

연결 후 SSLContext.Method을 확인했지만 연결 후 여전히 sslvSSLv23이 표시됩니다. SSLContext.SSLVersions[sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1]입니다.

어떻게 정보를 얻을 수 있습니까?

답변

5

특정 협상 된 프로토콜은 SSL/TLS 세션이 설정된 후 TIdSSLIOHandlerSocketOpenSSL.SSLSocket.Cipher.Version 속성에 있습니다. OpenSSL에는 SSL_get_version() 기능이 있습니다 (Indy는 사용하지 않지만 직접 호출 할 수 있음).

+0

'Cipher.Version'은 현재 프로토콜을 사용하고 있지 않은 것으로 보입니다. (또는 뭔가 심각하게 누락되었습니다.) 예를 들어 클라이언트에서 TLS1.1 만 사용하면 'Cipher.Version'은'TLSv1/SSLv3 '을 반환합니다. SSL_get_version을 살펴 보겠습니다. –

+0

SSL_get_version이 내가 원하는 정보를 제공했습니다. 감사. –

+0

@KenBourassa 흠,'SSL_CIPHER_get_version()'은 그렇게 사용되지 않았지만 [documentation] (https://www.openssl.org/docs/manmaster/man3/SSL_CIPHER_get_version.html)과 같이 변경되었습니다. 내가 마지막으로 본 이후로, 그 행동은 시간이 지남에 따라 분명히 변했습니다. 이 경우'SSL_get_version()'을 사용하십시오. 나는 그것을 위해 새로운 속성을 통합 할 수 있습니다. –