2017-03-23 77 views
1

道歉很長的職位,但我真的想徹底...SSL失敗使用python請求

我有一個專門的網站,作爲橋樑,交換各種環保車型之間的數據從遠程服務器運行並在不同類型的操作系統(Linux,MacOS和Windows)上運行。 基本上,每臺服務器都可以將數據文件上傳/下載到網站,然後使用另一臺服務器上的不同型號進一步處理文件。

網站有一些基本的保護(IP過濾,密碼和SSL使用LetsEncrypt證書)。所有遠程服務器都可以通過我們創建的簡單Web界面訪問該站點並上載/下載數據。

現在我們試圖用一個簡單的python(2.7)守護進程(基於請求模塊)自動化一些交換。守護進程監視某些文件夾並將內容上傳到網站。

守護進程在所有遠程服務器上都能正常工作,除了運行Windows 7 Enterprise 64bit的服務器。該服務器安裝了Python 2.7.13,幷包含以下軟件包:DateTime(4.1.1),psutil(5.2.0),pytz(2016.10),請求(2.13.0),zope.interface(4.3.3)。

從這個服務器的SSL連接工作正常通過Web瀏覽器,但是程序總是返回:

raise SSLError(e, request=request) 
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661) 

下面是我們試過到目前爲止:

  • 設置驗證=假。這可以正常工作,但我們不能在我們的最終生產環境中使用它。
  • 從守護程序工作的其他服務器複製證書,並設置verify =(證書文件的名稱)(不成功)
  • 設置'用戶代理'與我們從網站上的Windows機器上獲得的完全相同的字符串,當連接完成時使用網絡瀏覽器(不成功)

我們應該關注的其他設置Windows服務器嘗試解決問題?它可以是一個防火牆設置,以某種方式允許瀏覽器的SSL連接通過,但阻止python守護進程?

UPDATE
運行這是產生錯誤的代理級別替換所有SSL證書在Windows遠程服務器的組織。
他們的IT人員通過將我們網站的URL添加到代理設置上的「傳遞」網站列表來解決我們的問題。

這工作,現在很好。然而,我想知道我們是否可以直接在Python中處理證書替換...

回答

1

請求不像您的瀏覽器那樣使用您的Windows根CA存儲。

來自文檔: 默認情況下,請求捆綁了一組信任的根CA,它們源自Mozilla信任存儲庫。但是,這些僅針對每個請求版本更新一次。

可信CA的列表也可以通過REQUESTS_CA_BUNDLE環境變量指定。

你可以從字面上這樣做:

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem 
r = requests.get(url, verify=cafile) 

或者你可以使用CERTIFI如果您的CA證書是由公共實體簽訂。

+0

感謝您的回覆。我們已經嘗試過這種方法(第二個重點),但沒有成功。我編輯了我的問題以確保它被清除。 – user6357781

+0

你複製了哪個證書?您需要頒發證書頒發機構證書,而不是Web服務器證書。 – Artagel

+0

我們從守護進程工作的另一個Windows服務器複製了cacert.pem文件。從C:\ Python27 \ lib \ site-packages \ requests \ cacert.pem – user6357781