🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

Python

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

Q&A

解決済

1回答

33907閲覧

プロキシ環境下でのPython SSLエラーの無視もしくは証明書の指定をする方法

nakamiri

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

Python

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

0グッド

0クリップ

投稿2021/01/06 14:59

編集2021/01/06 16:44

解決したいこと

透過型プロキシの環境下でPythonのライブラリ(slackbot)を利用して外部とHTTPSでやり取りをしたいのですが、
下記エラーが発生してしまうため無視もしくは証明書の指定をして外部と正常にHTTPS通信をできるようにしたいです。

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)

動かしたいPythonライブラリはSlackbotのため、
requestsのようなCURL_CA_BUNDLE=''のようなものがうまく効かず、なんとかできないかと考えている状況です。

(sample-slackbot) nakamiri@ITPC00603:~/work/sample-slackbot$ CURL_CA_BUNDLE="" python run.py start slackbot /home/nakamiri/.local/share/virtualenvs/sample-slackbot-YXuvx29z/lib/python3.9/site-packages/urllib3/connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host 'slack.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings warnings.warn( Traceback (most recent call last): File "/home/nakamiri/work/sample-slackbot/run.py", line 19, in <module> main() File "/home/nakamiri/work/sample-slackbot/run.py", line 13, in main bot = Bot() File "/home/nakamiri/.local/share/virtualenvs/sample-slackbot-YXuvx29z/lib/python3.9/site-packages/slackbot/bot.py", line 20, in __init__ self._client = SlackClient( File "/home/nakamiri/.local/share/virtualenvs/sample-slackbot-YXuvx29z/lib/python3.9/site-packages/slackbot/slackclient.py", line 43, in __init__ self.rtm_connect() File "/home/nakamiri/.local/share/virtualenvs/sample-slackbot-YXuvx29z/lib/python3.9/site-packages/slackbot/slackclient.py", line 48, in rtm_connect self.parse_slack_login_data(reply) File "/home/nakamiri/.local/share/virtualenvs/sample-slackbot-YXuvx29z/lib/python3.9/site-packages/slackbot/slackclient.py", line 71, in parse_slack_login_data self.websocket = create_connection(self.login_data['url'], http_proxy_host=proxy, File "/home/nakamiri/.local/share/virtualenvs/sample-slackbot-YXuvx29z/lib/python3.9/site-packages/websocket/_core.py", line 487, in create_connection websock.connect(url, **options) File "/home/nakamiri/.local/share/virtualenvs/sample-slackbot-YXuvx29z/lib/python3.9/site-packages/websocket/_core.py", line 210, in connect self.sock, addrs = connect(url, self.sock_opt, proxy_info(**options), File "/home/nakamiri/.local/share/virtualenvs/sample-slackbot-YXuvx29z/lib/python3.9/site-packages/websocket/_http.py", line 77, in connect sock = _ssl_socket(sock, options.sslopt, hostname) File "/home/nakamiri/.local/share/virtualenvs/sample-slackbot-YXuvx29z/lib/python3.9/site-packages/websocket/_http.py", line 182, in _ssl_socket sock = _wrap_sni_socket(sock, sslopt, hostname, check_hostname) File "/home/nakamiri/.local/share/virtualenvs/sample-slackbot-YXuvx29z/lib/python3.9/site-packages/websocket/_http.py", line 156, in _wrap_sni_socket return context.wrap_socket( File "/home/nakamiri/.pyenv/versions/3.9.1/lib/python3.9/ssl.py", line 500, in wrap_socket return self.sslsocket_class._create( File "/home/nakamiri/.pyenv/versions/3.9.1/lib/python3.9/ssl.py", line 1040, in _create self.do_handshake() File "/home/nakamiri/.pyenv/versions/3.9.1/lib/python3.9/ssl.py", line 1309, in do_handshake self._sslobj.do_handshake() ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)

環境

羅列するとこんな環境です

  • Windows 10 ( or WSLv1 Ubuntu18.04 )
  • Python 3.9
  • Slackbotを動かしたい
  • 透過型プロキシが設置されたよくあるオフィスNW
  • PCにはプロキシが利用する証明書がインストール済

証明書については、

  • Windows10はcertlm.mscで確認できる信頼されたルート証明機関配下
  • WSLv1 Ubuntu18.04はUbuntu標準方法で、/etc/ssl/certsに配置後update-ca-certificates

で証明書のインストールを実施しています


試したこと

ここから下は回答の参考になればと思い、色々試したことを記載しています

Windows 10 ネイティブで

  • Python 3.9をインストーラでインストール
  • pip実行時に上記SSLエラーが発生したためWin10は一旦諦め、WSLで試すことに

pip実行時エラー

1PS C:\Users****\Desktop> pip install pipenv 2WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection 3broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))': /simple/pipenv/ 4WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection 5broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))': /simple/pipenv/ 6WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection 7broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))': /simple/pipenv/ 8WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection 9broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))': /simple/pipenv/ 10WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection 11broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))': /simple/pipenv/ 12Could not fetch URL https://pypi.org/simple/pipenv/: There was a problem confirming the ssl certificate: 13HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pipenv/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))) - skipping 14ERROR: Could not find a version that satisfies the requirement pipenv (from versions: none) 15ERROR: No matching distribution found for pipenv 16Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed 17certificate in certificate chain (_ssl.c:1122)'))) - skipping

WSLv1 Ubuntu 18.04

slackbot実行のトライアンドエラー

CURL_CA_BUNDLEの設定

環境変数でCURL_CA_BUNDLE=''を実施したが、RTMに入る前の通常のリクエスト部のエラーしか消えず

見つけたエラーを無視しそうな設定

こちらのQiita記事で見つけたコードをmain関数の定義前のライブラリインポート直後で実行しましたが、変化なしでした。
(Python2系向けのものなのでしょうか...)

また、その後ろに下記のような内容を追加してみましたが、同様でした。

ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE

(上記のCURL_CA_BUNDLEを消すと、一発目の通常リクエストもエラーになり悪化してしまいました)

SSL関連の環境変数での調整

下記のような設定を順次試しましたが、全てエラーで止まってしまいました

SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
SSL_CERT_FILE=インストール時に利用した追加用証明書
SSL_CERT_DIR=/etc/ssl/certs/

環境構築周り

  • pyenvでPython 3.9系をインストール時にwget関連でのエラーが発生したため、上記証明書インストール実施
  • 証明書エラーが消えたことを確認できたので、pyenvでPython3.9インストール
  • pipで同様のエラーが発生したので--trusted-hostで逃げて環境構築

ここまでで、wget/curlは普通に実行できるが、Pythonのバイナリで実行されるHTTPS通信がエラーとなることを確認
その上でslackbotを利用したBotアプリを作成して実行すると、同様にエラーが発生するため冒頭のSSLエラーの無視や解決方法を伺いたいです。

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

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

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

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

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

meg_

2021/01/06 15:24

pip install XXX 実行時に「self signed certificate in certificate chain」のエラーが発生したということでしょうか? 同じようなproxy環境下(windows10)にてそのようなエラーが起きていないため確認です。※pyenvということはWSLでのエラー? windows側でのpip install XXX 実行時にも同じエラー出ますか?
nakamiri

2021/01/06 15:32 編集

わかりづらい質問になってしまってすみません。 試したことの章より下は全て解決に向けてのトライアンドエラーでして、 回答の参考になればと思い載せた感じでした。 もう少し伝わりやすいよう強調しておきますね。 聞きたい内容はProxy環境下で「slackbot」を使ってBotを正常動作させたい、という質問です。
meg_

2021/01/06 16:22

「slackbot」のことは分からないのですが、現状はpythonを用いたhttps通信全般が「self signed certificate in certificate chain」のエラーで出来ない、ということでしょうか? requestsモジュールを用いたスクレイピングも出来ないと理解して良いでしょうか? それともSlackbot以外のhttps通信は動作しているのでしょうか?
nakamiri

2021/01/06 16:41

> 現状はpythonを用いたhttps通信全般が「self signed certificate in certificate chain」のエラーで出来ない、ということでしょうか? ご認識どおりです。特に何も設定変更等せずに実施すると同様のエラーが出てしまう状況です。 > requestsモジュールを用いたスクレイピングも出来ないと理解して良いでしょうか? こちらは少し違いまして、具体的にはslackというチャットSaaSに繋ぎに行きたく、 その際利用するライブラリ内部ではrequests以外にも、websocketを利用しているため、 そちらでSSLのエラーを引いてしまっているようでした。 全体的なStackTraceを貼ったほうが伝わりやすそうなので、貼っておくようにします。
jbpb0

2021/01/07 00:30 編集

こちらでは、python(3.x)でプロキシ超える場合は、たいていは、 https://qiita.com/shutokawabata0723/items/9733a7e640a175c23f39 と、 https://stackoverflow.com/questions/3168171/how-can-i-open-a-website-with-urllib-via-proxy-in-python/36881923 の「Python 3 is slightly different here.」と書かれてる回答部分の合わせ技(両方やる)でなんとかなってますが、そういうことは既に試されたのでしょうね 「slackbot」は分からないので、外していたらごめんなさい 【追記】解決したことに気付かずに書いてしまいました すみません
nakamiri

2021/01/07 00:46

>jbpb0さん コメントありがとうございます。 qiitaの記事についての記載は試していたのですが、 requestsで実行している部分には効いたもののwebsocketでの通信部でエラーとなってしまってました (ssl moduleを使っていてもsocketだと上手く行かないのかもしれないですね。。。) 後者StackOverflowのほうですが、残念ながらここの環境が明示型プロキシではなくて、 透過型プロキシだったもので試すことができませんでした...
guest

回答1

0

自己解決

websocket側にもCA証明書指定のための環境変数があったようでして、
実行時に下記を指定した所解決できました。

WEBSOCKET_CLIENT_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt

皆様確認回答ありがとうございました。

投稿2021/01/07 00:09

nakamiri

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問