web-dev-qa-db-fra.com

Python Requests - Erreur SSL pour le certificat côté client

J'appelle une API REST avec des demandes dans python et jusqu'à présent, j'ai réussi quand j'ai défini verify=False).

Maintenant, je dois utiliser le certificat côté client que je dois importer pour l'authentification et j'obtiens cette erreur chaque fois que j'utilise la cert (.pfx). cert.pfx est protégée par mot de passe.

r = requests.post(url, params=payload, headers=headers, 
                  data=payload, verify='cert.pfx')

Voici l'erreur que j'obtiens:

Traceback (most recent call last):
File "C:\Users\me\Desktop\test.py", line 65, in <module>
r = requests.post(url, params=payload, headers=headers, data=payload, verify=cafile)
File "C:\Python33\lib\site-packages\requests\api.py", line 88, in post
return request('post', url, data=data, **kwargs)
File "C:\Python33\lib\site-packages\requests\api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Python33\lib\site-packages\requests\sessions.py", line 346, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python33\lib\site-packages\requests\sessions.py", line 449, in send
r = adapter.send(request, **kwargs)
File "C:\Python33\lib\site-packages\requests\adapters.py", line 322, in send
raise SSLError(e)
requests.exceptions.SSLError: unknown error (_ssl.c:2158)

J'ai également essayé openssl pour obtenir .pem Et la clé mais avec .pem Et obtenir SSL: CERTIFICATE_VERIFY_FAILED

Quelqu'un peut-il m'indiquer comment importer les certificats et où les placer? J'ai essayé de chercher mais toujours confronté au même problème.

14
onlyme

J'ai eu le même problème. Le paramètre verify semble faire référence au certificat du serveur. Vous souhaitez que le paramètre cert spécifie votre certificat client.

J'ai dû utiliser OpenSSL pour convertir pour obtenir un fichier PEM de certificat et un fichier PEM clé.

import requests
cert_file_path = "cert.pem"
key_file_path = "key.pem"

url = "https://example.com/resource"
params = {"param_1": "value_1", "param_2": "value_2"}
cert = (cert_file_path, key_file_path)
r = requests.get(url, params=params, cert=cert, verify=False)

J'ai toujours eu des problèmes avec les demandes qui ne fonctionnaient pas bien avec certains serveurs SSL, mais je pense que la distinction verify/cert pourrait être votre problème.

33
bbayles