web-dev-qa-db-ja.com

Pythonリクエスト-クライアント側の証明書のSSLエラー

REST APIをpythonのリクエストで呼び出しており、これまでに_verify=False_を設定すると成功しました。

今、私は認証のためにインポートする必要があるクライアント側の証明書を使用する必要があり、cert (.pfx). cert.pfxを使用しているたびにこのエラーが発生します。パスワードで保護されています。

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

これは私が得ているエラーです:

_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)
_

また、opensslで_.pem_とキーを取得しようとしましたが、_.pem_を使用して_SSL: CERTIFICATE_VERIFY_FAILED_を取得しました

証明書をインポートする方法と配置する場所を誰かに教えてもらえますか?検索を試みましたが、同じ問題に直面しました。

14
onlyme

私も同じ問題を抱えていました。 verifyパラメータはサーバーの証明書を参照しているようです。 certパラメータでクライアント証明書を指定する必要があります。

証明書PEMファイルとキーPEMファイルを取得するには、OpenSSLを使用して変換する必要がありました。

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)

一部のSSLサーバーでリクエストがうまく機能しないという問題がまだありましたが、verify/certの違いが問題であると思います。

33
bbayles