我读过一篇文档说 Python 2 只有ssl.PROTOCOL_TLSv1
常量,并且ssl.PROTOCOL_TLSv1_1
是ssl.PROTOCOL_TLSv1_2
在 Python 3.4 中添加的。那么如何在 Python 2 中使用 TLS 1.1 和 1.2 呢?
PS。我不想使用 TLS 1.0,因为它有一些安全漏洞。TLS 1.2 现在是最新版本,所以我想让我的程序只使用 TLS 1.2;如果服务器不支持 TLS 1.2,那么就让连接失败。
我很抱歉再次提出一个老问题,看来Python 2.7.9 将引入对TLS1.1 和 TLS1.2的支持,计划于2014 年 12 月左右发布。
我最近不得不终止与相互验证的 SSL 的 TLSv1.2 连接,这在 vanilla 2.7.8 上是行不通的。我正要开始痛苦地将我的网络 i/o 密集型应用程序移植到 Python 3,将每个字符串更改为字节,然后返回用于接收/发送。它会很糟糕。
然后我找到了 PEP466。您可以很容易地将 PEP466(Google it)的补丁应用到 2.7.7 或 2.7.8 以使 TLS 1.1 和 TLS 1.2 正常工作。
PEP 466 的补丁是 @ http://bugs.python.org/file36423/ssl-backport.diff
此外,您将需要以下补丁来修复在 SSL 代码中构造错误时导致段错误的 Unicode 相关错误:
这个补丁是@http://bugs.python.org/file36017/unicode_fromformat.patch
此外,一旦您应用了补丁,您应该在配置和编译之前从技术上执行以下操作:
~/Python-2.7.8$ python3 ./Tools/ssl/make_ssl_data.py /usr/include/openssl/ _ssl_data.h
~/Python-2.7.8$ mv _ssl_data.h Modules/_ssl_data.h
然后,您可以配置 && make && make install 并且应该可以使用 TLSv1.1 和 TLSv1.2。
~/Python-2.7.8$ ./configure --enable-unicode=ucs2 --prefix=/opt/Python-2.7.8/ --with-pth && make -j && sudo make install
TLS 1.2 现在对我来说工作得很好,所以我不必将巨大的应用程序移植到 Python 3。
无论如何,PEP 页面上的措辞令人困惑,这听起来像是 12 月的 2.7.9 应该包含此支持(?)但我不确定这是否准确,或者这是否只是手动解决方法,直到您将代码移植到 Python 3。我想这并不重要。
不,没有计划在 Python 2 中支持 TLS 1.1 或 1.2,请参阅:
http://bugs.python.org/issue16692
它明确指出 TLS > 1.0 不会向后移植到 Python 2.7,Python 维护人员多次表示 Python 2.8 不会发生。
请注意,目前很少有服务器支持 TLS 1.2。希望将来会有所改变。