我一直在使用 Python 脚本(Ubuntu 14.04LTS 上的 2.7.6)通过“feedparser”模块从 RSS 提要中选取条目。本周,它停止了与某个特定网站的合作。挖掘后, feedparser.parse() 返回一个带有错误代码的结构:
'bozo_exception': URLError(SSLError(1, '_ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure'),)
我是否需要强制使用特定的 SSL 或 TLS 版本?
尝试使用各种 urllib 模块(urllib、urllib2、urllib3)进入较低级别。最终是这样的:
import urllib3
req = urllib3.PoolManager().request('GET', my_https_url)
它回复了一些警告,例如:
/usr/lib/python2.7/dist-packages/urllib3/util/ssl_.py:133: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecurePlatformWarning
显然,这个问题在 Python 2.7.9 中已经修复,但这个老版本的 Ubuntu 14.04 并没有预装这个系统。但是我想要这个操作系统,因为还有一些老旧的软件需要继续运行。
简单的解决方法:将我的 RSS-picker 更新为仅使用 python3 就足够了(3.4.3 是最新的 14.04)。不需要向 feedparser 模块传递任何特殊的东西,例如传输级别选项(例如以某种方式创建 SSLContext)——默认值工作得很好。唯一需要对 python2->3 进行的更改是 print() 和一些字符串到字节的 s.encode('utf-8') 内容。
答案1
您向我们展示了 SSLv3 协商错误。 SSLv3 已被淘汰。
SSLv2 于 2011 年废弃,SSLv3 于 2015 年废弃。
最新的发行版不再实现 SSLv2 和 v3。即使在具有仍然支持这些协议的旧 Unix /linux 版本的正确配置站点中,Apache 也已配置为禁用它们很长时间了。
正如您所发现的,解决方案是升级支持其他协议的更现代的库/软件。请注意,如果您有一些依赖于 SSLv3 的内部遗留解决方案,根据您升级软件的版本,您可能会在不久的将来遇到问题。