1. ホーム
  2. python

Python Requests - システムの ca-certificates を使用するには (debian/ubuntu)?

2023-09-13 20:18:34

質問

私は自己署名されたルート CA 証明書を debian の /usr/share/ca-certificates/local でインストールし sudo dpkg-reconfigure ca-certificates . この時点で true | gnutls-cli mysite.local は幸せであり true | openssl s_client -connect mysite.local:443 は幸せですが、python2 と python3 のリクエストモジュールは証明書と幸せでないと主張します。

python2:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/requests/adapters.py", line 497, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

python3

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/bin/python3.5/site-packages/requests/api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "/usr/local/bin/python3.5/site-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/bin/python3.5/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/bin/python3.5/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/bin/python3.5/site-packages/requests/adapters.py", line 497, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

なぜ python はシステムの ca-certificates バンドルを無視するのですか、そしてどのように統合するのですか?

どのように解決するのですか?

から https://stackoverflow.com/a/33717517/1695680

Python のリクエストにシステムの ca-certificates バンドルを使わせるには、 自身の組み込みバンドルよりもそれを使うように指示する必要があります。

export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt


Requestsは参考のため、ここにそのバンドルを埋め込みます。

/usr/local/lib/python2.7/site-packages/requests/cacert.pem
/usr/lib/python3/dist-packages/requests/cacert.pem

または、新しいバージョンでは、証明書を取得するために追加のパッケージを使用します。 https://github.com/certifi/python-certifi

どのファイルから証明書が読み込まれるかを確認するために、試すことができます。

Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
>>> import certifi
>>> certifi.where()
'/etc/ssl/certs/ca-certificates.crt'