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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Python 3.x

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

SSL

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

プロキシ

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

Python

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

解決済

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

nakamiri
nakamiri

総合スコア7

Python 3.x

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

SSL

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

プロキシ

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

Python

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

1回答

0評価

0クリップ

12178閲覧

投稿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実行時エラー

PS C:\Users****\Desktop> pip install pipenv WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))': /simple/pipenv/ WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))': /simple/pipenv/ WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))': /simple/pipenv/ WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))': /simple/pipenv/ WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1122)'))': /simple/pipenv/ Could not fetch URL https://pypi.org/simple/pipenv/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(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 ERROR: Could not find a version that satisfies the requirement pipenv (from versions: none) ERROR: No matching distribution found for pipenv Could 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 certificate 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エラーの無視や解決方法を伺いたいです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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のほうですが、残念ながらここの環境が明示型プロキシではなくて、 透過型プロキシだったもので試すことができませんでした...

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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

SSL

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

プロキシ

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

Python

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