如何阻止OpenSSL使用系统证书?

3 投票
1 回答
2009 浏览
提问于 2025-04-16 05:59

我该怎么做才能让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 列表里),但这并不是必须的。这个列表只是帮助客户端选择证书时有用。

撰写回答