質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
OpenSSL

OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

815閲覧

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

NCC1701

総合スコア1683

OpenSSL

OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿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エラーにならないようにすればよいと考えております。

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

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

python 3.10.6
requests 2.29.0
certifi 2023.5.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bsdfan

2023/07/17 23:18 編集

(削除)
guest

回答1

1

自己解決

Cybertrust Japan SureServer CA G4でググるとどの中間 CA 証明書をダウンロードすればよいですか?
が見つかりました。
商品名の「SureServer」の中間 CA 証明書ovg4.txtをダウンロードしました。
次にそのページ中のルート・中間 CA 証明書 ダウンロードを辿りました。

リンク先に「SureServer 中間 CA 証明書 ダウンロード]のリンクをたどって、

コモンネーム (または OU の値)設定ダウンロードプロファイル
ルート証明書Security Communication RootCA2不要※1テキスト形式詳細

からテキスト形式scrca2.txtをダウンロードしました。

上二つのtxtを cert.pem として一つのファイルにして

bash

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

で、エラーがなくなりました。

投稿2023/07/17 12:12

NCC1701

総合スコア1683

ams2020👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問