2010-10-23 87 views
3

如何防止OpenSSL(特別是Python的ssl模塊)使用系統認證中心?防止OpenSSL使用系統證書?

換句話說,我想它只能信任我指定的認證機構,沒有別的:

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) 
+0

爲什麼?當您嘗試進行身份驗證來完成授權時,通常會出現這種情況。他們不是一回事。 – EJP 2010-10-25 10:24:34

+1

@EJP,如果您不希望'CertificateRequest' TLS消息(請求客戶端證書的那個消息)中的'certificate_authorities'列表包含您不想要的列表(此列表的DN傾向於默認情況下從可用CA的列表填充)。另外,您的系統上可能存在您不信任的默認CA,即使僅用於身份驗證。 – Bruno 2010-10-25 15:37:30

+0

我使用SSL在「封閉」網絡上對客戶端進行身份驗證:我(我的CA)將簽署所有證書,因此沒有理由相信任何其他CA. – 2010-10-25 15:44:40

回答

2

我剛跑了一些測試,並列出您的CA選擇在ca_certs參數正是你所需要的。

我試過的系統是Linux和Python 2.6。如果你不使用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參數CA不是,我也得到ssl_error_unknown_ca_alert(如預期)。

請注意,無論哪種方式,都不會發送客戶端證書CA列表(位於CertificateRequest TLS消息的certificate_authorities列表中),但這不是必需的。只有幫助客戶選擇證書纔有用。

+0

但是,當客戶端發送證書時,系統是否信任CA?也就是說,如果'MY_PERSONAL_CA'的證書是系統信任的(在我的情況下,我已經將它添加到OS X系統鑰匙串中......不知道我的頭頂是什麼Linux等價物)和'ca_certs = [ TESTING_CA]',那麼我發現* * *'MY_PERSONAL_CA' *或*'TESTING_CA'簽名的證書將被接受。這是OS X 10.6上的Python 2.6。 – 2010-10-25 17:50:51

+0

所以,我想,如果Linux *沒有一個可信CA的中央列表(如OS X鑰匙串),這只是OS X上的一個問題? (而且,因爲我的嵌入式系統*不會運行OS X,所以我可以忽略它)。 – 2010-10-25 17:59:46

+0

一位朋友建議'/ usr/share/ca-certificates'是一些Linux發行版使用的中央存儲庫......當我有機會時,我會看到會發生什麼。 – 2010-10-25 18:11:32