web-dev-qa-db-fra.com

Comment vérifier une date d'expiration de certificat SSL avec aiohttp?

Je sais comment obtenir des informations de certificat telles que la date d'expiration en utilisant par exemple pyopenssl, mais est-il possible de le faire avec un objet aiohttp response ?

5
azmeuk

Je ne pouvais pas le trouver dans la documentation de aiohttp, mais vous pouvez utiliser ssl pour obtenir le certificat et OpenSSL pour obtenir sa date non ultérieure et le comparer à votre date actuelle afin de déterminer s'il a expiré ou non . Plus détails ici Comment importer OpenSSL en python Et un extrait de code qui fait à peu près ce dont vous avez besoin ci-dessousVous devrez toutefois installer OpenSSL auparavant.

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()

Pour les sites utilisant SNI, voir la réponse suivante sur la façon d'obtenir le certificat ssl.get_server_certificate pour les sites avec SNI (Indication du nom du serveur)

9
BoboDarph

Les réponses précédentes sont correctes, mais vous pouvez aussi utiliser le socket lib (test avec 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)

 enter image description here

1
grepit

Vérifiez ce dépôt appelé check-tls-certs . Ce n'est pas vraiment aiohttp, mais il est basé sur asyncio et fonctionne donc de manière asynchrone.

1
dio