【问题标题】:How to determine which TLS/SSL protocol was negotiated when using sslvSSLv23?使用 sslvSSLv23 时如何确定协商了哪个 TLS/SSL 协议?
【发布时间】:2017-04-28 21:25:29
【问题描述】:

我正在使用 TIdSSLIOHandlerSocketOpenSSL 打开 TLS/SSL 连接。我目前想支持 tls 1.0 到 1.2。

我这样初始化 IOHandler。

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

建立连接后,我如何才能获得为连接协商的协议? (既是为了保证客户端和测试服务器的配置都是正确的,也是为了统计目的。

我在连接后检查了SSLContext.Method,但连接后仍然显示sslvSSLv23SSLContext.SSLVersions 显示 [sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1]

那么我如何获得这些信息?

【问题讨论】:

    标签: delphi indy indy10


    【解决方案1】:

    建立 SSL/TLS 会话后,具体协商的协议在 TIdSSLIOHandlerSocketOpenSSL.SSLSocket.Cipher.Version 属性中。 OpenSSL 还有一个SSL_get_version() 函数(Indy 没有用到,但是可以直接调用)。

    【讨论】:

    • Cipher.Version 似乎不包含当前使用的协议(或者我严重遗漏了一些东西)。例如,如果我强制在客户端上仅使用 TLS1.1,Cipher.Version 返回“TLSv1/SSLv3”。我将研究 SSL_get_version。
    • SSL_get_version 确实为我提供了我正在寻找的信息。谢谢。
    • @KenBourassa 嗯,SSL_CIPHER_get_version() 以前不是那样的,但看起来documentation 自从我上次看到它以来已经发生了变化,所以这种行为显然随着时间的推移而发生了变化。在这种情况下,请坚持使用SSL_get_version()。我可能会为它集成一个新属性。
    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多