2016-12-13 6 views
8

TIdSSLIOHandlerSocketOpenSSLを使用してTLS/SSL接続を開きます。私は現在、tls 1.0〜1.2をサポートしたいと考えています。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()'を使用してください。私は新しい財産を統合するかもしれない。 –

関連する問題