はじめに
Pythonで、SSL証明書が必要なサイトに対して、REST APIを呼ぶと下記のようなSSLエラーとなる。事前にダウンロードしたSSL証明書を指定することで、エラーを解消することができる(参考)。本記事では、SSL証明書をPython上でダウンロードしてREST APIで設定するまでを行う方法を紹介する。この方法は自己署名証明書などを利用している場合に有用である。
requests.exceptions.SSLError: HTTPSConnectionPool(host='example.com', port=443): Max retries exceeded with url: /exampleapi (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)'),))
動作確認環境
- Windows 10 64bit
- Python 3.10.11
方法
依存関係のインストール
以下のコマンドを使用して、必要なパッケージをインストールする。
-
requests
-
pyopenssl
pip install requests pip install pyopenssl
Pythonコード
SSL証明書をダウンロードして、REST APIを呼ぶサンプルコードを以下に示す。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests
from OpenSSL import crypto
import ssl
import socket
# SSL証明書をダウンロードしてファイルに保存する関数
def download_cert(hostname, port, output_file):
context = ssl.create_default_context()
conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=hostname)
conn.connect((hostname, port))
cert_bin = conn.getpeercert(True)
cert = crypto.load_certificate(crypto.FILETYPE_ASN1, cert_bin)
with open(output_file, 'wb') as f:
f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
conn.close()
def main():
# SSL証明書をダウンロードしてファイルに保存
download_cert('example.com', 443, '/tmp/example-certificates.crt')
# 上記SSL証明書を利用して、REST APIを呼ぶ
requests.get('https://example.com/exampleapi', verify='/tmp/example-certificates.crt')
if __name__ == '__main__':
main()
まとめ
PythonでSSL証明書を利用してREST APIを呼び出す方法を紹介した。自己署名証明書を利用している場合に有用。
参考