質問: feed.parse(url) ``` これでnewsの中身を見ると ``` {'feed': {}, 'entries': [], 'bozo': 1, 'bozo_exception': URLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)'))} ``` となってしまう。 どうやらssl認証がうまくいかないっぽいです。 どうしたらいいでしょうか? 使用バージョン Python 3.7.1 macOS Mojave 10.14.2 feedparser 5.2.1 です。
回答: これは macOS にインストールされている Python 3 が、バージョン 3.6 から macOS デフォルトの証明書に依存しなくなったために起こるエラーです。 ### 解決策 `/Applications/Python 3.7/Install Certificates.command` を実行して、証明書をダウンロードして使えるようにする。(`Python 3.7` の部分は Python のバージョンに応じて適宜変えてください。) たとえば「アプリケーション」から Python を探し、そのフォルダーへ行き、`Install Certificates.command` をダブルクリックすれば良いです。 ### 詳細 macOS の Python はバージョン 3.6 から macOS にインストールされている OpenSSL に依存せず、独自に OpenSSL を内包してそちらを使うようになりました。したがって CA 証明書も共有されず、macOS 上のブラウザから HTTPS のサイトにアクセスできても、Python からはアクセスできないという状況が生まれます。 このことの解決策は macOS 用 Python の README に書かれています: > > Certificate verification and OpenSSL > ------------------------------------ > > > **NEW** This variant of Python 3.6 now includes its own private copy of OpenSSL 1.0.2. Unlike previous releases, the deprecated Apple-supplied OpenSSL libraries are no longer used. This also means that the trust certificates in system and user keychains managed by the Keychain Access application and the security command line utility are no longer used as defaults by the Python ssl module. For 3.6.0b1, a sample command script is included in /Applications/Python 3.6 to install a curated bundle of default root certificates from the third-party certifi package (). If you choose to use certifi, you should consider subscribing to the project's email update service to be notified when the certificate bundle is updated. > > > The bundled pip included with the Python 3.6 installer has its own default certificate store for verifying download connections. > > > この説明が言っているように、Python 用の OpenSSL に証明書をインストールしなければいけません。そのためのスクリプトが用意されており、それが上述の `Install Certificates.command` です。詳しく書かれていませんがこのコマンドは pip から certifi パッケージをインストールし、更に OpenSSL のディレクトリに certifi への symlink を貼ります。 ### 参考 * Error CERTIFICATE_VERIFY_FAILED in macOS -- Python tracker * urllib and “SSL: CERTIFICATE_VERIFY_FAILED” Error -- Stack Overflow * Scraping: SSL: CERTIFICATE_VERIFY_FAILED error for http://en.wikipedia.org -- Stack Overflow