2016-07-04 46 views
2

我試圖連接到公司內部網HTTPS服務器,該服務器使用內部CA,從Python內運行/在Linux機器上運行的請求。我有一個.pem文件,其中包含我們的證書(4096位RSA,CSSM_KEYUSE_VERIFY,CA = true)。將單個證書添加到請求

我把它放到/usr/share/ca-certificates的子文件夾中,並使用sudo dpkg-reconfigure ca-certificates來將它集成到系統中。

requests documentation,我發現:

您可以通過驗證路徑到CA_BUNDLE文件或目錄與信任的CA證書......如果驗證設置爲一個目錄的路徑,該目錄必須有使用OpenSSL提供的c_rehash實用程序進行處理。

我相信(但不確定)/etc/ssl/certs滿足這種情況。現在

,我試圖以各種方式要求:

requests.get(download_url) 
# throws requests.exceptions.SSLError: ("bad handshake: Error([ 
# ('SSL routines', 'ssl3_get_server_certificate', 
# 'certificate verify failed')],)",) 

requests.get(download_url, verify = False) 
# works, but is obviously bad (and spits out a warning) 

requests.get(download_url, verify = pem_file_path) 
# same SSLError as above (option shows no effect) 

requests.get(download_url, cert = pem_file_path) 
requests.get(download_url, cert = '/etc/ssl/certs') 
# both throw OpenSSL.SSL.Error: [ 
# ('PEM routines', 'PEM_read_bio', 'no start line'), 
# ('SSL routines', 'SSL_CTX_use_PrivateKey_file', 'PEM lib')] 

requests.get(download_url, verify = '/etc/ssl/certs') 
# Finally, this raises an unprintable exception: 
# requests.exceptions.SSLError: <exception str() failed> 

其實,using self-signed certificates with requests in python看起來可能說明了同樣的問題(但還沒有回答)。

+1

你得到一個SSL錯誤,以便先驗證自己與OpenSSL的HTTPS ://www.openssl.org/docs/manmaster/apps/verify.html – stark

+0

你是對的。問題出在證書上,而不是我嘗試使用它的方式。 –

回答

0

感謝@stark,我發現問題在於我的證書文件已過期。有了正確的,跟上時代的證書(甚至在DER格式,與.CER擴展名),以下語法現在工作:

requests.get(download_url, verify = cer_file_path) 
+0

你能多說一點嗎?我現在有同樣的問題,但我已經在線下載了pem文件證書。我如何發現它已過期或不好?我在哪裏可以找到一個好的? –

+0

哦,是的,我知道鏈接已經死了。 http://unix.stackexchange.com/questions/16226/how-can-i-verify-ssl-certificates-on-the-command-line可能有幫助,也許?據我所知,我只是使用''openssl verify/path/to/my.pem''。 –