概要
Google API Client for pythonでCloud ML EngineのAPIにアクセスしようとしたらSSL証明書関連でエラーがでて困った話。
(2018/08/09時点)
再現コード
requirements.txt
google-api-python-client
test.py
from googleapiclient import discovery if __name__ == '__main__': discovery.build('ml', 'v1')
再現手順
> python -V Python 3.6.6 > python -m venv venv > . venv/bin/activate.fish > pip -V pip 18.0 from /(略)/python3.6/site-packages/pip (python 3.6) > pip install -r google-api-python-client > python test.py (略) File "/Users/hoge/.anyenv/envs/pyenv/versions/3.6.6/lib/python3.6/ssl.py", line 814, in __init__ self.do_handshake() File "/Users/hoge/.anyenv/envs/pyenv/versions/3.6.6/lib/python3.6/ssl.py", line 1068, in do_handshake self._sslobj.do_handshake() File "/Users/hoge/.anyenv/envs/pyenv/versions/3.6.6/lib/python3.6/ssl.py", line 689, in do_handshake self._sslobj.do_handshake() ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:841)
対応
いろいろと調べたのですが、httplib2が参照するSSL証明書を最新にするって対応があったけど、それも少し古い記事だったので、解決には至らず。。。
下記記事を参考にhttplib2.Http
に”’disable_ssl_certificate_validation”’のオプションを指定して、とりあえずの対応をしました。
http://d.hatena.ne.jp/knaka20blue/20180314/1521020791
対応
from googleapiclient import discovery from httplib2 import Http if __name__ == '__main__': http = Http(disable_ssl_certificate_validation=True) discovery.build('ml', 'v1', http=http)
SSL証明書のチェックを無効化するオプションなので、実運用でこのままだとキツめ。