PythonでSSL証明書情報を取得したい

Yuu
2025-10-31
2025-10-31
こんにちは、Yuuです。
こないだ気温が下がってきたので京都の「寺田屋」まで散歩しました。
京都は趣きのある建物が多く、散歩してるだけでも歴史を感じる良い街ですね。

今回はSSL証明書関連の業務の中で困った内容と解決させた方法について皆様にシェアしたいと思います。
■SSL証明書の情報を取得したい場合

Linuxでcurlコマンドを叩いた際に、-vを付けると証明書の情報を取得できます。
コマンド例:
curl -v https://example.com
結果:。
* Server certificate:
*  subject: C=US; ST=California; L=Los Angeles; O=Internet Corporation for Assigned Names and Numbers; CN=*.example.com
*  start date: Jan 15 00:00:00 2025 GMT
*  expire date: Jan 15 23:59:59 2026 GMT
*  subjectAltName: host "example.com" matched cert's "example.com"
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert Global G3 TLS ECC SHA384 2020 CA1
*  SSL certificate verify ok.
 
■Windowsのcurlでは情報が取れない?
WindowsOS上で動いているPythonから同じようにcurlコマンドを実行してデータを取得してみました。
import subprocess

url = "https://example.com"
result = subprocess.run(["curl","-v",url],capture_output=True,text=True)
print(result)
しかし結果は以下の通り👇
HTML本文は取得できるものの、証明書情報が出力されませんでした。
CompletedProcess(args=['curl', '-v', 'https://example.com'], returncode=0, stdout='<!doctype html>………</html>)
これは、通信ライブラリの違いによるものです。
  • Linuxの curl → OpenSSL を使用
  • Windowsの curl → Schannel(Windows独自のTLSライブラリ)を使用
Schannel では証明書情報の詳細を取得できないため、このような差が生まれます。
 
■ 解決方法:
そこで登場するのが、Python標準ライブラリの 「SSL」モジュールです
追加インストール不要で、どのOSでも同じように動作します。
コマンド例:
import ssl
import socket
from datetime import datetime

host = "example.com"
port = 443

# サーバーへSSL接続
context = ssl.create_default_context()
with socket.create_connection((host, port)) as sock:
    with context.wrap_socket(sock, server_hostname=host) as ssock:
        cert = ssock.getpeercert()

# 結果を整形して出力
subject = dict(x[0] for x in cert["subject"])
issuer = dict(x[0] for x in cert["issuer"])
expire_date = datetime.strptime(cert["notAfter"], "%b %d %H:%M:%S %Y %Z")

print("🔹 Common Name (CN):", subject.get("commonName"))
print("🔹 Issuer:", issuer.get("commonName"))
print("🔹 Expire Date:", expire_date.strftime("%Y/%m/%d %H:%M:%S"))
出力結果:
🔹 Common Name (CN): *.example.com
🔹 Issuer: DigiCert Global G3 TLS ECC SHA384 2020 CA1
🔹 Expire Date: 2026/01/15 23:59:59
■ まとめ
僕はこちらをベースに、取得したいコモンネームが複数あったので、for文で回して一気にデータを取得、成形するように致しました。
これで証明書のデータを簡単に取得することが出来るので皆さんもぜひ試してください!