Python 阻止OpenSSL使用系统证书?

Python 阻止OpenSSL使用系统证书?,python,ssl,openssl,Python,Ssl,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

如何防止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)
ssl\u socket=ssl.wrap\u socket(newsocket,server\u side=True,certfile=“my\u cert.pem”,

ca_certs=MY_TRUSTED_CAs,#我刚刚运行了一些测试,在
ca_certs
参数中列出您选择的ca正是您所需要的

我试用过的系统是使用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.
回溯(最近一次呼叫最后一次):
文件“sockettest.py”,第18行,在
证书需求=ssl.cert\u必需,ssl\u版本=ssl.PROTOCOL\u TLSv1)
文件“/usr/lib/python2.6/ssl.py”,第350行,在wrap_套接字中
抑制_参差_eofs=抑制_参差_eofs)
文件“/usr/lib/python2.6/ssl.py”,第113行,在__
证书要求、ssl版本、ca证书)
ssl.SSLError:_ssl.c:317:未指定用于验证其他方证书的根证书。
我还尝试使用客户机在
CA\u certs
参数中发送一个不是来自CA的证书,并得到
ssl\u error\u unknown\u CA\u alert
(如预期)


请注意,无论哪种方式,都没有客户端证书CA列表发送(在
CertificateRequest
TLS消息的
certificate\u authorities
列表中),但这不是必需的。只有帮助客户选择证书才有用。

为什么?当您试图让身份验证执行授权工作时,通常会出现这种情况。它们不是同一件事。@EJP,如果您不希望
CertificateRequest
TLS消息(请求客户端证书的消息)中的
certificate\u Authority
列表包含您不想要的列表(默认情况下,此DNs列表倾向于从可用CA列表填充),则此选项非常有用。此外,您的系统上可能存在您不信任的默认CA,即使仅用于身份验证。我正在使用SSL对“封闭”网络上的客户端进行身份验证:我(我的CA)将对其所有证书进行签名,因此没有理由信任任何其他CA。@Bruno:从安全角度讲,这是什么意思,“您不信任的系统上的默认CA”?如果你不信任他们,他们就不应该在那里。@David Wolever:你有理由不信任他们吗?但是,当客户端发送证书时,你的系统信任CA吗?也就是说,如果系统信任
MY_PERSONAL_CA
的证书(在我的情况下,我已经将其添加到了OS X系统密钥链中…不知道Linux的等价物是什么)和
CA证书=[TESTING_CA]
,然后我发现由
MY_PERSONAL\u CA
TESTING\u CA
签署的证书将被接受。这是OSX10.6上的Python2.6。所以,我想,如果Linux没有可信CA的中心列表(比如OSX密钥链),这只是OSX上的一个问题?(而且,由于我的嵌入式系统不会运行OS X,我可以放心地忽略)。一位朋友建议,
/usr/share/ca certificates
是一些Linux发行版使用的中央存储库……如果有机会,我会看看会发生什么。