2016-01-13 113 views
4

現狀: 目標網站(一個PROD預網址,說https://my-pre-prod-site.com/login,例如)使用自簽名證書。 從瀏覽器,該網站是沒有任何問題的,在蟒蛇請求使用自簽名證書

問題說明(自簽名證書的警告是通過在瀏覽器中的證書信任存儲抑制)通過HTTPS訪問: 一個簡單的Python腳本使得get調用使用請求目標站點失敗,或者在不同的情況下,以下錯誤:

requests.exceptions.SSLError: [Errno 0] _ssl.c:344: error:00000000:lib(0):func(0):reason(0)

requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) The simple script used (on the python prompt) is :

import requests 
res = requests.get('https://my-pre-prod-site.com/login') 

**的東西已經嘗試過**

  1. 我做想跳過SSL驗證。因此,verify = false不適合我。
  2. 我已經使用以下具有相同的錯誤

res = requests.get('https://my-pre-prod-site.com/login', verify = os.path.join(os.getcwd(),'test.pem')其中test.pem是通過連接以下命令以該順序輸出創建的PEM文件:

openssl rsa -in ~/Desktop/CertPath/private.key -check

openssl x509 -pubkey -noout -in ~/Desktop/CertPath/certificate.pem

該腳本從〜/ Desktop/CertPath運行,因此getcwd()會爲證書提供正確的路徑。

  1. 我試過另一個test.pem文件,以及連接順序顛倒的地方。它仍然會拋出同樣的錯誤。
  2. 已嘗試傳遞持有公鑰的.pem文件和持有私鑰的.key文件,分別(單獨)以及與結果相同的錯誤。

環境的詳細信息,如果有幫助

OS - ElCapitan蘋果
要求 - 2.9.0
Python的 - 2.7.10
正在使用Python的 OpenSSL的 - 「OpenSSL的0.9.8zg 7月14日2015'

注 - openssl版本似乎不成問題。因爲即使使用OpenSSL的更新版本,這些錯誤都是一樣的 - 與Python 2.6在Ubuntu 測試了使用OpenSSL 1.x的

+0

作爲一種變通方法,也許你可以使用我們的加密?你的開發配置將更接近你的產品。 – Tom

回答

2

這個問題是舊的,但如果有人想在這裏。

您正在將私鑰和公鑰放入test.pem。這是錯誤的。驗證param要求的是它可以信任的證書。

res = requests.get('https://my-pre-prod-site.com/login', verify = os.path.join(os.getcwd(),'test.pem') 

test.pem應該包含所有可信任證書的列表。但是你在test.pem中提供的是你的公鑰和私鑰。你〜/ Desktop/CertPath/certificate.pem文件本身應該進入它。

試試這個:

res = requests.get('https://my-pre-prod-site.com/login', verify = '~/Desktop/CertPath/certificate.pem')