概要

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証明書のチェックを無効化するオプションなので、実運用でこのままだとキツめ。

元記事はこちら

Google API Client for pythonでSSL証明証エラーがでたので応急処置した