是否有Python API可以返回有关TLS连接的精确密码信息?

时间:2013-04-04 22:40:54

标签: python ssl https encryption

我正在尝试编写一个python(或Java)程序,该程序与网站建立https连接,然后返回https连接的属性。我一直在使用python的ssl(http://docs.python.org/2/library/ssl.html),特别是.cipher()方法。我输出的主要问题是它不是非常具体:

('RC4-SHA','TLSv1 / SSLv3',128)

这是www.amazon.com的输出。但是当我进入浏览器并手动检查连接时,我真的可以看到它是:带有SHA1消息认证,RSA密钥交换和TLS v1.0的RC4。实际上,.cipher()方法为TLS版本1.0,1.1和1.2输出TLSv1 / SSLv3,并为SHA1和SHA256输出SHA。

是否有任何Python(或Java)API可以为我提供有关https连接的更多信息?

1 个答案:

答案 0 :(得分:4)

Python ssl模块只是OpenSSL的一个包装器,它不能提供比库提供的更多信息。但实际上,我认为你不会错过任何信息。 具体。你总是得到TLSv1.0和SHA1。

首先,OpenSSL 0.9中的TLSv1/SSLv3表示TLSv1.0。它不能表示1.1或1.2,因为OpenSSL 0.9不支持这些协议。 (你可能正在使用OpenSSL 0.9。例如,我刚从Python.org下载的3.3.0 64位Mac二进制安装程序使用0.9.8r。)你可以用ssl.OPENSSL_VERSION从Python检查这个。

其次,RC4-SHA表示SHA1,而不是SHA256。 RC4-SHA只是TLSv1.0密码套件TLS_RSA_WITH_RC4_128_SHA的OpenSSL名称。这是密码的完整规范;在名称末尾有SHA256个不同的密码。您可以看到RFC 2246中指定的密码套件列表及其TLS 1.0的附录(1.1 RFC4346和1.2 RFC 5246。我不认为除了代码内部以外的任何地方都指定了从OpenSSL名称到RFC名称的映射,但是如果您有命令行OpenSSL工具,则可以键入openssl ciphers以转储所有建议的OpenSSL名称列表它将发送的密码套件,然后您可以将它们与握手中发送的值进行匹配。 (除了openssl s_client -connect www.amazon.com:443 -msg之外,还要查看握手,-debug或尝试-msg或其他标志,而不是/。

那么,为什么您的浏览器会为某些相同的网站显示TLSv1.2或SHA256?因为您的浏览器具有完全不同的SSL库(或更新的OpenSSL),因此与服务器进行完全不同的握手,并最终同意不同的密码套件,因此它会报告不同的信息。

所以,并不是说Python正在协商TLSv1.2或SHA256而只是将它隐藏起来;它正在与同一台服务器协商TLSv1.0和SHA1,并告诉你它做了什么。

如果你想使用一个可以处理OpenSSL 0.9无法处理的东西的库,那么有很多选择。如果您安装OpenSSL 1.0.1或更高版本并构建PyOpenSSL,我相信(我没有测试过)您应该能够协商更新的协议和密码,并发现您已经这样做了。如果你重建Python或独立的ssl模块,它甚至可能会重做。 (如果这些都不起作用,那么PyPI上有更多的OpenSSL wrappers and other SSLTLS模块,或者你自己只能ctypes。{/ p>