如何阻止OpenSSL使用系统证书?
我该怎么做才能让OpenSSL(特别是Python的ssl
模块)不使用系统的证书颁发机构呢?
换句话说,我希望它只信任我指定的证书颁发机构,而不信任其他任何机构:
ssl_socket = ssl.wrap_socket(newsocket, server_side=True, certfile="my_cert.pem",
ca_certs=MY_TRUSTED_CAs, # <<< Only CAs specified here
cert_reqs=ssl.CERT_REQUIRED, ssl_version=ssl.PROTOCOL_TLSv1)
1 个回答
2
我刚刚做了一些测试,发现把你选择的证书颁发机构(CA)列在 ca_certs
参数中,正是你需要的。
我是在使用 Python 2.6 的 Linux 系统上进行测试的。如果你不使用 ca_certs
,那么就无法使用 cert_reqs=ssl.CERT_REQUIRED
:
Traceback (most recent call last):
File "sockettest.py", line 18, in <module>
cert_reqs=ssl.CERT_REQUIRED, ssl_version=ssl.PROTOCOL_TLSv1)
File "/usr/lib/python2.6/ssl.py", line 350, in wrap_socket
suppress_ragged_eofs=suppress_ragged_eofs)
File "/usr/lib/python2.6/ssl.py", line 113, in __init__
cert_reqs, ssl_version, ca_certs)
ssl.SSLError: _ssl.c:317: No root certificates specified for verification of other-side certificates.
我还尝试用一个客户端发送一个不在 ca_certs
参数中的证书,结果得到了 ssl_error_unknown_ca_alert
(这也是预料之中的)。
需要注意的是,无论怎样,客户端证书的 CA 列表并不会发送(在 CertificateRequest
TLS 消息中的 certificate_authorities
列表里),但这并不是必须的。这个列表只是帮助客户端选择证书时有用。