天天看點

Python:擷取ssl證書資訊和到期時間

1、通過證書擷取

openssl x509 -in <cert>.pem -noout -dates      

2、通過域名擷取

echo | openssl s_client -servername <doman> -connect <doman>:443 2>/dev/null | openssl x509 -noout -dates      

3、通過腳本擷取

# coding: utf-8 
# 查詢域名證書到期情況

import re
import subprocess
from datetime import datetime


def get_re_match_result(pattern, string):
    match = re.search(pattern, string)
    return match.group(1)


def parse_time(date_str):
    return datetime.strptime(date_str, "%b %d %H:%M:%S %Y GMT")


def format_time(date_time):
    return datetime.strftime(date_time, "%Y-%m-%d %H:%M:%S")


def get_cert_info(domain):
    """獲驗證書資訊"""
    cmd = f"curl -Ivs https://{domain} --connect-timeout 10"

    exitcode, output = subprocess.getstatusoutput(cmd)

    # 正則比對
    start_date = get_re_match_result('start date: (.*)', output)
    expire_date = get_re_match_result('expire date: (.*)', output)

    # 解析比對結果
    start_date = parse_time(start_date)
    expire_date = parse_time(expire_date)

    return {
        'start_date': start_date,
        'expire_date': expire_date
    }


def get_cert_expire_date(domain):
    """獲驗證書剩餘時間"""
    info = get_cert_info(domain)
    print(info)

    expire_date = info['expire_date']

    # 剩餘天數
    return (expire_date - datetime.now()).days


if __name__ == "__main__":
    domain = 'www.baidu.com'
    expire_date = get_cert_expire_date(domain)
    print(expire_date)
      

參考

檢視域名https證書到期時間 基于python檢查SSL證書到期情況代碼執行個體