【问题标题】:Python ssl get ciphers supportedPython ssl 获取支持的密码
【发布时间】:2017-11-07 19:29:22
【问题描述】:

我想知道为什么没有一种简单的方法可以找到特定 ssl 上下文支持的密码? (还是我错过了)

我知道我们可以使用socket.cipher() 来获取用于特定socket 连接的那个,但是为什么不获取所有支持的密码呢?

还有一点,

我有一台服务器正在运行带有密码字符串"HIGH+TLSv1.2:!MD5:!SHA1" 的 openssl 库。客户端是一个使用ssl库的python文件,带有默认选项,建立连接后socket.cipher()显示如下元组

('DHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256)

当我明确提到 TLSv1.2 时,如何与 TLSv1 建立连接,以及当 TLSv1 不支持高于 SHA1 的任何东西时,它如何使用 SHA384

【问题讨论】:

    标签: python sockets ssl tls1.2 pyopenssl


    【解决方案1】:

    我想知道为什么没有一种简单的方法可以找到特定 ssl 上下文支持的密码? (还是我错过了)

    只有 OpenSSL 1.1.0 添加了一个函数 SSL_CTX_get_ciphers 来访问这个列表,这个功能在 Python 中还没有。

    ('DHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256)
    

    当我明确提到 TLSv1.2 时,如何与 TLSv1 建立连接,以及当 TLSv1 不支持高于 SHA1 的任何东西时,它如何使用 SHA384?

    根据the source code,Python 正在使用 SSL_CIPHER_get_version 来查找版本字符串。匹配的 OpenSSL documentation 表示 OpenSSL 1.0.2:

    SSL_CIPHER_get_version() 返回字符串,该字符串指示首先定义密码的 SSL/TLS 协议版本。 目前是 SSLv2 或 TLSv1/SSLv3。在某些情况下,它可能会返回“TLSv1.2”,但不会;使用 SSL_CIPHER_description()

    因此,这是 OpenSSL 中的一个错误,根据 OpenSSL 1.1.0 中相同功能的文档,该错误已在最新的 OpenSSL 版本中得到修复。

    【讨论】:

    • 那么,(如果我理解正确的话)我需要使用更高版本的 Python(这反过来又会使用最新的 OpenSSL 版本)来完成这项工作?是否有任何解决方法可以使这项工作?
    • @Haris:是的,当使用针对较新 OpenSSL 版本编译的 Python 时,应该修复此问题。作为一种解决方法,您可以根据openssl ciphers -V 'ALL' 的输出创建自己的映射。
    • 谢谢。还有一件事。由于返回的元组显示正在使用 SHA384,这是否可以视为一个标志,表明使用了高于 TLSv1 的 TLS 版本?是否有低于 TLSv1.2 的其他版本支持 SHA256 和更高的 mac 密码?
    • @Haris:SHA256 及更高版本仅适用于 TLS 1.2。但是,如果您想知道连接中实际使用的 TLS 协议版本,则不应查看密码的版本部分,它应该只显示使用密码所需的最小 TLS 版本。相反,您应该致电socket.version()
    • 哇,谢谢。这就像一个魅力。我现在可以看到正在使用 TLSv1.2。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    相关资源
    最近更新 更多