小编sni*_*ies的帖子

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

问题:

Python的ssl模块并没有抱怨证书,尽管cacert.pem文件中没有提供颁发CA(下面的测试用例2).我使用从Mozilla中提取的CA. Firefox正在抱怨未知的CA(在这种情况下是国防部).

似乎只有证书本身得到验证,而不是CA已知.我正在运行Python 2.7.1并使用ssl版本的OpenSSL 0.9.8r.

测试用例:

检查Firefox中的以下站点以及下面的python示例客户端.

  1. https://www.verisign.com - 应该工作,CA是众所周知的
  2. https://www.us.army.mil - 不应该工作,因为CA不知道
  3. https://www.pcwebshop.co.uk - 不应该工作,只有Parallels Panel证书

案例2.虽然它不应该由python客户端验证.

案例3.按预期抛出异常:

routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Run Code Online (Sandbox Code Playgroud)

示例Python客户端:

CA文件:http://curl.haxx.se/ca/cacert.pem(由curl维护者提供的mozilla默认CA).

http://docs.python.org/library/ssl.html#client-side-operation的略微修改版本:

# test_ssl.py   
import socket, ssl, pprint, sys
host = sys.argv[1]

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# require a certificate from the server
ssl_sock = ssl.wrap_socket(s,
                           # http://curl.haxx.se/ca/cacert.pem
                           ca_certs="cacert.pem", 
                           cert_reqs=ssl.CERT_REQUIRED)

ssl_sock.connect((host, 443))

print repr(ssl_sock.getpeername())
print ssl_sock.cipher()
print pprint.pformat(ssl_sock.getpeercert())

# Set a simple HTTP request -- use httplib in actual code.
ssl_sock.write("""GET …
Run Code Online (Sandbox Code Playgroud)

python security ssl https certificate

5
推荐指数
1
解决办法
2336
查看次数

标签 统计

certificate ×1

https ×1

python ×1

security ×1

ssl ×1