requests(截止2.12.4)不支援p12格式的證書,如果拿到的是p12證書可以轉換為pem格式再使用。
檢視p12證書
keytool -v
-list
-storetype pkcs12 -keystore your_pkcs.p12 -storepass your_password
轉換為pem格式
# 證書和私鑰乙個檔案儲存
openssl pkcs12 -in your_pkcs.p12 -out client.pem
# 證書和私鑰分開
openssl pkcs12 -in your_pkcs.p12 -out client_certs.pem -clcerts -nokeys [password options]
openssl pkcs12 -in your_pkcs.p12 -out keys.pem -nocerts [password options]
使用示例
import requests
req = requests.get('', cert='client.pem', verify=false)
# or
# req = requests.get('', cert=('client_certs.pem', 'keys.pem'), verify=false)
這裡有個問題,只能支援沒有密碼的證書,否則會要求輸入證書密碼。
兩種解決方法
1)不加密私鑰,轉換pem時,用-nodes放棄加密,硬編碼和沒密碼差別不大
openssl pkcs12 -in your_pkcs.p12 -out client.pem -nodes
openssl pkcs12 -in your_pkcs.p12 -out keys.pem -nocerts -nodes
2)以下方法需要一些包(pyopenssl,ndg-httpsclient, pyasn1)以及n多依賴包,未測試
pkcs12_data = ...
password_bytes = ...
class pkcs12context(requests.packages.urllib3.contrib.pyopenssl.openssl.ssl.context):
def __init__(self, method):
super(passwordcontext, self).__init__(method)
p12 = openssl.crypto.load_pkcs12
(pkcs12_data, password_bytes)
self.use_certificate
(p12.get_certificate())
self.use_privatekey
(p12.get_privatekey())
# monkey-patch
thesubclass
into
openssl.ssl
soit
isused
inplace
ofthe
stock
version
requests.packages.urllib3.contrib.pyopenssl.openssl.ssl.context = pkcs12context
3)還可以等待官方支援
參考
雙向認證 什麼是單向認證和雙向認證?
雙向認證 ssl 協議要求伺服器和使用者雙方都有證書。單向認證 ssl 協議不需要客戶擁有ca證書,具體的過程相對於上面的步驟,只需將伺服器端驗證客戶證書的過程去掉,以及在協商對稱密碼方案,對稱通話金鑰時,伺服器傳送給客戶的是沒有加過密的 這並不影響 ssl 過程的安全性 密碼方案。這樣,雙方具體的...
ssl雙向認證
ssl雙向認證 ca.key 根證書的私鑰 ca.crt 根證書的簽名證書 server.key,server.crt client.key,client.crt 1 openssl ca.key,ca.crt 2 openssl server.key server.csrserver.crt 3 ...
Nginx Https 雙向認證
1.1 單向認證 ssl 步驟 1 客戶端的瀏覽器向伺服器傳送客戶端 ssl 協議的版本號,加密演算法的種類,產生的隨機數,以及其他伺服器和客戶端之間通訊所需要的各種資訊 2 伺服器向客戶端傳送 ssl 協議的版本號,加密演算法的種類,隨機數以及其他相關資訊,同時伺服器還將向客戶端傳送自己的證書 3...