是python';ssl模块是否正确验证证书?(我有一个奇怪的例子,这让我很困扰)
问题: Python的ssl模块并不抱怨证书,尽管cacert.pem文件中没有提供颁发CA(下面的测试用例2)。我使用从Mozilla中提取的CAs。Firefox正确地抱怨未知CA(在本例中是国防部) 似乎只有证书本身得到验证,而不是CA是已知的。我正在运行Python 2.7.1,并使用ssl版本OpenSSL 0.9.8r 测试用例: 在Firefox和下面的python示例客户端中检查以下站点是python';ssl模块是否正确验证证书?(我有一个奇怪的例子,这让我很困扰),python,security,ssl,https,certificate,Python,Security,Ssl,Https,Certificate,问题: Python的ssl模块并不抱怨证书,尽管cacert.pem文件中没有提供颁发CA(下面的测试用例2)。我使用从Mozilla中提取的CAs。Firefox正确地抱怨未知CA(在本例中是国防部) 似乎只有证书本身得到验证,而不是CA是已知的。我正在运行Python 2.7.1,并使用ssl版本OpenSSL 0.9.8r 测试用例: 在Firefox和下面的python示例客户端中检查以下站点 -如果有效,CA是已知的 -不应工作,因为CA未知 -不应工作,仅平行面板证书 案例2。由p
routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
示例Python客户端:
CA文件:(由curl维护者提供的mozilla默认CA)
略加修改的版本:
#test_ssl.py
导入套接字、ssl、pprint、sys
主机=sys.argv[1]
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#需要来自服务器的证书
ssl_sock=ssl.wrap_套接字,
# http://curl.haxx.se/ca/cacert.pem
ca_certs=“cacert.pem”,
证书需求=ssl。证书需求)
ssl_sock.connect((主机,443))
打印报告(ssl_sock.getpeername())
打印ssl_sock.cipher()
打印pprint.pformat(ssl\u sock.getpeercert())
#设置一个简单的HTTP请求——在实际代码中使用httplib。
ssl\u sock.write(““”GET/HTTP/1.0\r\n
主机:“+Host+”\r\n\r\n“”
#读取一块数据。未必
#读取服务器返回的所有数据。
data=ssl_sock.read()
打印数据
#请注意,关闭SSLSocket也将关闭基础套接字
ssl_sock.close()
用法:
python test_ssl.py www.verisign.com
python test_ssl.py www.us.army.mil
python test_ssl.py www.pcwebshop.co.uk
更新: 在strcat和其他人的帮助下,我可以确认这种行为特定于:
- OSX Lion 10.7.1
- Python2.7.1和Python2.6.7
- OpenSSL 0.9.8r 2011年2月8日
我在两台Mac电脑和其他几个盒子上进行了测试。我怀疑mac上的OpenSSL在我传递给它的文件旁边使用了第二个CA证书源。也许这使得www.us.army.mil成为一个特殊的测试用例,因为safari似乎也相信它是开箱即用的。有谁知道其他大型自签名网站,或者mac上的openssl是如何工作的 解决方案是: 通过测试,我可以确认OSX上的openssl确实使用了系统CA证书存储,即使没有像上面的python示例中那样指定 我使用www.us.army.mil作为测试用例,因为它是一个自签名的站点(http://royal.pingdom.com/2008/08/19/new-ssl-policy-in-firefox-hurting-tens-of-thousands-of-sites/). 因为OSX上的系统CA证书包含两个DoD证书,所以Safari没有抱怨,还有我的python测试客户端
如果我在Keychan Access->System Roots->certificates中不信任这些证书,python客户端将显示预期的行为,这将确认python ssl/OpenSSL使用OSX 10.7.1上的系统根证书,无论是否指定。我不知道这是否是预期的行为,但它确实让我感到惊讶 苹果公司在其OpenSSL分支中引入了一个补丁,该补丁引入了这一可能的安全缺陷或功能,不管你怎么看它。请参阅此修补程序:
解决此问题的一种方法是将您的python应用程序与您从openssl.org的源代码构建的openssl版本捆绑在一起,该版本不应具有TEA集成。您正在测试哪一版本的python?python 2.7.1(r271:86832,2011年6月16日,16:59:05)ssl.OPENSSL_VERSION==“OPENSSL 0.9.8r 2011年2月8日”编辑的问题包含以下两个方面。。。我在www.us.army.mil地址('OpenSSL 1.0.0g 2012年1月18日')上遇到python2.6.7、python2.7.2和python3.2.2引发的异常。这对我理解网站上的问题有很大帮助。我总是指定一个特定的ca,但它永远不会被接受