[英]Python request with certificates error. Caused by SSLError(SSLError(9, '[SSL] PEM lib (_ssl.c:4027)
這是我的代碼:
import requests
url = 'https://ecomm.pashabank.az:18443/ecomm2/MerchantHandler'
headers = {'content-type' : 'application/json'}
data = { # some optional data
"command": "v",
"amount": "10",
"currency": "932",
"client_ip_addr": "167.992.139.153",
"msg_type": "SMS"
}
# all certificates are in the current directory within this script file
psroot = "PSroot.pem"
cert_file = "certificate.0025598.der"
key_file = "certificate.0025598.pem"
certs = (cert_file, key_file, psroot)
response = requests.post(url, cert=certs)
引發此錯誤:
Traceback (most recent call last):
File "/Users/mammadaliyevmammadali/Desktop/bank/main.py", line 19, in <module>
response = requests.post(url, cert=certs)
File "/Users/mammadaliyevmammadali/.local/share/virtualenvs/bank-wIDLHQju/lib/python3.9/site-packages/requests/api.py", line 115, in post
return request("post", url, data=data, json=json, **kwargs)
File "/Users/mammadaliyevmammadali/.local/share/virtualenvs/bank-wIDLHQju/lib/python3.9/site-packages/requests/api.py", line 59, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/mammadaliyevmammadali/.local/share/virtualenvs/bank-wIDLHQju/lib/python3.9/site-packages/requests/sessions.py", line 587, in request
resp = self.send(prep, **send_kwargs)
File "/Users/mammadaliyevmammadali/.local/share/virtualenvs/bank-wIDLHQju/lib/python3.9/site-packages/requests/sessions.py", line 701, in send
r = adapter.send(request, **kwargs)
File "/Users/mammadaliyevmammadali/.local/share/virtualenvs/bank-wIDLHQju/lib/python3.9/site-packages/requests/adapters.py", line 563, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='ecomm.pashabank.az', port=18443): Max retries exceeded with url: /ecomm2/MerchantHandler (Caused by SSLError(SSLError(9, '[SSL] PEM lib (_ssl.c:4027)')))
注意錯誤結尾的_ssl.c:4027 。 我找不到解決方法。 我需要驗證我的 3 個證書以處理請求。 怎么做? 為了安全起見,所有證書的格式和傳遞都正確無誤。 所有實現都是正確的,但我的腳本不起作用。 請幫忙!
cert_file = "certificate.0025598.der"
鑒於文件擴展名,這對我來說看起來像是 DER 格式的證書。 但是需要 PEM 格式。 證書可以從 DER 轉換為 PEM
openssl x509 -inform der -in certificate.0025598.der -out certificate.0025598.pem
然后改用certificate.0025598.pem
。
....由 SSLError(SSLError(9, '[SSL] PEM lib (_ssl.c:4027)')))
此錯誤是指源代碼中 Modules/_ssl.c 中的第 4027 行,但如果沒有您確切的 Python 版本,則不知道此行號處的代碼是什么。 所知道的是您正在使用某種 Python 3.9。 此行號附近的相關代碼是這樣的:
4031 r = SSL_CTX_use_certificate_chain_file(self->ctx,
4032 PyBytes_AS_STRING(certfile_bytes));
4033 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
4034 if (r != 1) {
...
4044 _setSSLError(NULL, 0, __FILE__, __LINE__);
這是嘗試加載作為客戶端證書給出的證書的代碼,即您的certificate.0025598.der
。 PEM lib
意味着錯誤來自 OpenSSL 中的一部分,該部分試圖將證書解釋為 PEM - 但失敗了。 因此它符合我最初的推測,即您的證書不是預期的 PEM 格式,而是 DER 格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.