概要
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'''のオプションを指定して、とりあえずの対応をしました。
対応
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証明書のチェックを無効化するオプションなので、実運用でこのままだとキツめ。
Cloud FunctionsでPython利用記事まとめ
https://qiita.com/kai_kou/items/2f65db5305ba280ad81e