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


概要

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

Cloud FunctionsでPython利用記事まとめ

https://qiita.com/kai_kou/items/2f65db5305ba280ad81e