Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是python';ssl模块是否正确验证证书?(我有一个奇怪的例子,这让我很困扰)_Python_Security_Ssl_Https_Certificate - Fatal编程技术网

是python';ssl模块是否正确验证证书?(我有一个奇怪的例子,这让我很困扰)

是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

问题:

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。由python客户端验证,但不应验证

    案例3。按预期引发异常:

    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,但它永远不会被接受