人生リアルタイムアタック

当面はPython学習帳

SSL証明書が正しくないサイトに対してPythonでアクセスする

HTTPSで提供しているサービスのローカル開発環境にPythonでアクセスを試みたらエラーが出た。

Traceback (most recent call last):
  File "/main.py", line 36, in <module>
    main()
  File "/main.py", line 18, in main
    soup = BeautifulSoup(opener.open(conf['login_url']).read().decode('utf-8'), 'html.parser')
  File "/usr/local/var/pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 465, in open
    response = self._open(req, data)
  File "/usr/local/var/pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 483, in _open
    '_open', req)
  File "/usr/local/var/pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 443, in _call_chain
    result = func(*args)
  File "/usr/local/var/pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 1283, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/usr/local/var/pyenv/versions/3.5.0/lib/python3.5/urllib/request.py", line 1242, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:646)>

PEP 0476に従い、Python2.7.9以降はSSL証明書が正しくない場合にはデフォルトでSSL認証エラーを出すようになった模様。 PEP 476 -- Enabling certificate verification by default for stdlib http clients | Python.org

開発環境にアクセスするだけのコードだったので、

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

上記を書いて実行したらアクセス可能になった。
セキュリティ上は安全と保証されないことを認識の上でご利用ください。

みんなのPython 第4版

みんなのPython 第4版