requests支援雙向認證

2021-07-25 14:10:35 字數 1751 閱讀 3151

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...