2023/07/17 23:18 編集
(削除)
投稿2023/07/17 08:14
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=Amazon 3# Issuer: CN=Amazon Root CA 2 O=Amazon 4# Issuer: CN=Amazon Root CA 3 O=Amazon 5# 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エラーにならないようにすればよいと考えております。
そのため、「どんなファイル」を「どこから」とってきて「どのディレクトリ」に配置すればよいでしょうか?
python 3.10.6
requests 2.29.0
certifi 2023.5.7
回答1件
あなたの回答
tips
プレビュー