2023年3月1日水曜日

Python で SSL 証明書の検証と期限チェックを行う方法

Python で SSL 証明書の検証と期限チェックを行う方法

概要

取得した SSL 証明書と鍵の検証を行う方法を紹介します
期限が切れていないと鍵との組み合わせが正しいかもチェックしてみたいと思います

環境

  • Python 3.10.2
  • cryptography 39.0.1
  • pyOpenSSL 23.0.0

インストール

  • pipenv install pyOpenSSL cryptography

サンプルコード

from datetime import datetime
import OpenSSL
import sys

# 証明書と鍵を読み込む
with open('./fullchain.pem', 'rb') as f:
    cert_data = f.read()

with open('./privkey.pem', 'rb') as f:
    key_data = f.read()

# フォーマットチェック
try:
    cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert_data)
    key = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, key_data)
except OpenSSL.crypto.Error as e:
    print('PEMフォーマットではありません')
    sys.exit(1)

# 有効期限の取得
bytes = cert.get_notAfter()
timestamp = bytes.decode('utf-8')
formatted_timestamp = datetime.strptime(timestamp, '%Y%m%d%H%M%S%z').date().isoformat()
print (f"有効期限は{formatted_timestamp}")

# 証明書と鍵のペアを検証する
context = OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_METHOD)
context.use_privatekey(key)
context.use_certificate(cert)

try:
    context.check_privatekey()
    print('証明書と鍵のペアは正しいです')
except OpenSSL.SSL.Error as e:
    print('証明書と鍵のペアが正しくありません:', e)

ちょっと解説

フォーマットチェックは load_certificate で読み込めたかどうかで判定します
エラーの場合はフォーマットエラーとして判断します

フォーマットが正しい場合は有効期限の取得を行います

最後に鍵とのペアチェックを証明書のコンテキストの check_privatekey で行います

参考サイト

0 件のコメント:

コメントを投稿