PythonでHTTPS通信を行う際、「SSL: CERTIFICATE_VERIFY_FAILED」などのエラーで困ったことはありませんか? 特にローカル環境やDocker、Windows環境などでは、SSL証明書の検証がうまくいかず、API通信やWebアクセスに失敗するケースがよくあります。
Python標準のhttp.clientとcertifiライブラリの違い、certifiの基本的なインストール・使い方、さらにhttp.clientでcertifiを使ってSSLContextを安全に設定する方法まで、詳しく解説します。
certifiとは?
certifiは、PythonでHTTPS通信を行う際に使用する「信頼されたルート証明書(CA証明書)」のセットを提供するライブラリです。これは、Mozillaが管理している最新の証明書リストをベースにしており、Pythonの中でもっとも信頼されているCA証明書ソースの一つです。
標準のPython SSLは、OSに依存した証明書を使用しますが、古いシステムや特殊な環境では証明書の検証に失敗することがあります。certifiを使えば、常に最新の信頼済み証明書を利用でき、セキュリティ面でも安心です。
certifiのインストールと基本的な使い方
まずはcertifiをインストールします。
pip install certifi
requestsライブラリと組み合わせて使うのが一般的です。
import requests
import certifi
response = requests.get(
"https://mjeld.com",
verify=certifi.where() # certifiが提供する証明書で検証
)
print(response.status_code)
これで、証明書エラーを回避しつつ、安全なHTTPS通信が可能になります。
http.clientとの違いは?
Pythonには標準でHTTP通信用のhttp.client
モジュールがありますが、certifiとの違いは主に以下の点にあります:
- http.clientは低レベルなライブラリで、ヘッダーやSSL設定を自分で構築する必要がある
- certifiを使えば最新のCA証明書が利用可能(セキュリティ向上)
- requests + certifiは、高レベルなAPIで、リダイレクトやCookie処理なども自動化
http.clientでcertifiを使う方法
標準のhttp.clientでも、certifiとSSLContextを組み合わせて安全にHTTPS通信ができます。以下のサンプルコードを参考にしてください。
import http.client
import ssl
import certifi
# certifiが提供するCA証明書を使ってSSLContextを作成
context = ssl.create_default_context(cafile=certifi.where())
# HTTPSConnectionにcontextを渡す
conn = http.client.HTTPSConnection("example.com", context=context)
conn.request("GET", "/")
res = conn.getresponse()
print(res.status)
print(res.read().decode())
conn.close()
このように設定することで、http.clientでも安全な証明書検証が可能になります。
まとめ:certifiでセキュアな通信を
PythonでHTTPS通信を安全に行うためには、最新のCA証明書を使ってSSL検証を正しく行うことが重要です。certifiを活用すれば、標準のSSL証明書に依存せず、安全かつクロスプラットフォームで信頼性の高い通信が実現できます。
特にAPI通信や外部サービスとの連携が多いアプリケーションでは、certifiの導入は非常におすすめです。