最近有個需求需要檢查管理域名證書是否過期, 需要連到各個域名然后下載證書檢查時間, 網上找了一通, 找到了目前來說比較方便的代碼..
import ssl, socket
hostname = 'www.qq.com'
c = ssl.create_default_context()
s = c.wrap_socket(socket.socket(), server_hostname=hostname)
s.connect((hostname, 443))
cert = s.getpeercert()
cert 里面就是證書的詳細信息了, 如下圖所示.
拿到這些信息后, 與當前時間進行對比, 就可以了.
在比較舊的系統上, 有可能出現 certificate verify failed: unable to get local issuer certificate
這種報錯
初步處理辦法:
- 更新系統的ca證書
yum update ca-certificates
- 重新編譯openssl
- 重新編譯Python3
如果這種辦法也無法解決這個報錯的話, 還有另一種方式進行檢查
需要提前安裝pip3 install pyOpenSSL
關鍵代碼如下:
import ssl
import time
import OpenSSL
hostname = 'www.qq.com'
port = 443
cert = ssl.get_server_certificate((hostname, port)).encode()
cert_obj = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
cert_time = int(time.strftime('%s', time.strptime(cert_obj.get_notAfter().decode(), '%Y%m%d%H%M%SZ')))
這樣也是能獲取到啟用了SSL功能服務端口的證書信息的.