发送请求时出现证书错误

Mas*_*Yab 5 python ssl request ssl-certificate python-3.x

我想发送XML到soap请求,我使用python请求,如下所示:

response = requests.post(url, data=body, headers=headers)
Run Code Online (Sandbox Code Playgroud)

当我发送请求时,我给出这个请求:

requests.exceptions.SSLError: HTTPSConnectionPool(host='49.1.92.38', port=7911): Max retries exceeded with url: /ECARE/CRMInterface_INV_Services (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))
Run Code Online (Sandbox Code Playgroud)

verify=False提出这样的请求:

response = requests.post(url, data=body, headers=headers, verify=False)
Run Code Online (Sandbox Code Playgroud)

我给出了一些错误,例如you can't send a request like that.

我意识到我必须随此请求发送证书才能获得成功响应

我有.cer.crt文件一起发送,但我像这样发送:

response = requests.post(url, data=body, headers=headers, cert=(c1, c2))
Run Code Online (Sandbox Code Playgroud)

并得到这个错误:

OpenSSL.SSL.Error: [('PEM routines', 'PEM_read_bio', 'no start line'), ('SSL routines', 'SSL_CTX_use_PrivateKey_file', 'PEM lib')]
Run Code Online (Sandbox Code Playgroud)

更新

我使用openssl x509 -inform der -in PK.cer -out PK.pem并尝试这个:

response = requests.post(url, data=body, headers=headers, verify='PK.pem')
Run Code Online (Sandbox Code Playgroud)

但这一次我得到了这个错误:

requests.exceptions.SSLError: HTTPSConnectionPool(host='49.1.92.38', port=7911): Max retries exceeded with url: /ECARE/CRMInterface_INV_Services (Caused by SSLError(CertificateError("hostname '49.1.92.38' doesn't match 'crm.at.com'",),))
Run Code Online (Sandbox Code Playgroud)

我想使用此证书文件发送此肥皂请求,但我找不到任何有帮助的内容。谁能帮我吗?

带着敬意。

Ste*_*ich 0

这里有几个问题:

...证书验证失败...

response = requests.post(url, data=body, headers=headers, verify=False)
Run Code Online (Sandbox Code Playgroud)

我给出了一些错误,例如you can't send a request like that.

首先,设置它不是一个好主意,verify=False因为这会完全禁用证书验证(即不安全)。不过,您现在不会收到 SSL 错误,而是收到不同的错误。这意味着它成功完成了 SSL 握手(无需证书验证)

您看到的错误可能是因为服务器不喜欢您的请求。由于不知道服务器实际想要什么以及您发送了什么,因此不可能说出您在这里做错了什么。

response = requests.post(url, data=body, headers=headers, cert=(c1, c2))
Run Code Online (Sandbox Code Playgroud)

并得到这个错误:

OpenSSL.SSL.Error: [('PEM routines', 'PEM_read_bio', 'no start line'), ('SSL routines', 'SSL_CTX_use_PrivateKey_file', 'PEM lib')]
Run Code Online (Sandbox Code Playgroud)

这是因为您使用了明确记录cert用于客户端证书的参数,即证书和匹配的私钥。看起来不像你这样的客户证书。我不确定您尝试使用的文件的内容是什么(“我有 .cer 和 .crt 文件”没有提及内容),但如果您尝试将这些文件用作 CA,则需要使用验证参数反而。