解決したいこと
透過型プロキシの環境下で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エラーの無視や解決方法を伺いたいです。
回答1件
あなたの回答
tips
プレビュー