SSL認証局の追加方法(python requests [SSL: CERTIFICATE_VERIFY_FAILED])

実現したいこと

python requests で SSL認証局はどのように追加すればよいでしょうか?
(この考え方であっているのか?後述)

発生している問題・エラーメッセージ

Traceback (most recent call last): File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/urllib3/connectionpool.py", line 703, in urlopen httplib_response = self._make_request( File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/urllib3/connectionpool.py", line 386, in _make_request self._validate_conn(conn) File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/urllib3/connectionpool.py", line 1042, in _validate_conn conn.connect() File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/urllib3/connection.py", line 419, in connect self.sock = ssl_wrap_socket( File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/urllib3/util/ssl_.py", line 449, in ssl_wrap_socket ssl_sock = _ssl_wrap_socket_impl( File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/site-packages/urllib3/util/ssl_.py", line 493, in _ssl_wrap_socket_impl return ssl_context.wrap_socket(sock, server_hostname=server_hostname) File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/ssl.py", line 513, in wrap_socket return self.sslsocket_class._create( File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/ssl.py", line 1071, in _create self.do_handshake() File "/opt/homebrew/Caskroom/miniconda/base/envs/3_10_6/lib/python3.10/ssl.py", line 1342, in do_handshake self._sslobj.do_handshake() ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)

該当のソースコード

bash

1python -c 'import requests; print(requests.get("https://xxx.xxxxxx.biz").status_code)'

試したこと

bash

1python -c 'import requests; print(requests.get("https://teratail.com").status_code)'2# -> 200

は問題ありません。証明書の発行元(SSL認証局)が「Issuer: C = US, O = Amazon, CN = Amazon RSA 2048 M02」だそうで(ブラウザの鍵マークから)、

bash

1python -c 'import certifi;print(certifi.contents())'|grep Issuer|grep -i amazon 2# Issuer: CN=Amazon Root CA 1 O=Amazon3# Issuer: CN=Amazon Root CA 2 O=Amazon4# Issuer: CN=Amazon Root CA 3 O=Amazon5# Issuer: CN=Amazon Root CA 4 O=Amazon

でわかるように、certifi パッケージに含まれているからだと考えてます。

他方、「https://xxx.xxxxxx.biz(諸般の事情により伏せ字)」では証明書の発行元が「Issuer: C = JP, O = "Cybertrust Japan Co., Ltd.", CN = Cybertrust Japan SureServer CA G4」となっており、certifi パッケージには含まれていません。

なので、証明書について適切な検証ができずにエラーになったと理解してます。かといって、certifi では独自にCAの追加/削除はしないとドキュメントにありました。

そこで認証局のCybertrust JapanのCAを追加・利用してSSLエラーにならないようにすればよいと考えております。

そのため、「どんなファイル」を「どこから」とってきて「どのディレクトリ」に配置すればよいでしょうか?

補足情報(FW/ツールのバージョンなど)

python 3.10.6
requests 2.29.0
certifi 2023.5.7

コメントを投稿

0 コメント