Ich weiß, wie man mit pyopenssl Zertifikatinformationen wie das Ablaufdatum abruft, aber ist es möglich, dies mit einem aiohttp Antwortobjekt zu tun?
Ich konnte es in der Dokumentation von aiohttp nicht finden, aber Sie können ssl verwenden, um das cert und OpenSSL zu bekommen, um das notAfter-Datum zu erhalten. Vergleichen Sie es mit Ihrem aktuellen Datum, um herauszufinden, ob es abgelaufen ist oder nicht. Weitere Details hier Importieren von OpenSSL in Python Und ein Codefragment, das ziemlich genau das macht, was Sie unter Benötigen. Sie müssen OpenSSL installieren vorher aber
pip install pyopenssl
import OpenSSL
import ssl, socket
cert=ssl.get_server_certificate(('www.google.com', 443))
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
x509.get_notAfter()
Informationen zu Websites, die SNI verwenden, finden Sie in der folgenden Antwort, wie Sie das Zertifikat ssl.get_server_certificate für Sites mit SNI (Server Name Indication) erhalten.
Vorherige Antworten sind korrekt, aber Sie können auch die Socket-Lib verwenden (dies ist ein Test mit Python 3.7).
from urllib.request import Request, urlopen, ssl, socket
from urllib.error import URLError, HTTPError
import json
#some site without http/https in the path
base_url = 'CHANGE_ME_TO_YOUR_SITE'
port = '443'
hostname = base_url
context = ssl.create_default_context()
with socket.create_connection((hostname, port)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print(ssock.version())
data = json.dumps(ssock.getpeercert())
# print(ssock.getpeercert())
print (data)
Überprüfen Sie dieses Repo mit dem Namen check-tls-certs . Es ist nicht wirklich aiohttp, aber es basiert auf asyncio und funktioniert daher asynchron.