Как проверить срок действия SSL-сертификата с помощью aiohttp?

Я знаю, как получить информацию о сертификате, такую ​​как дата истечения срока действия, например, с помощью pyopenssl, но возможно ли это сделать с помощью aiohttp объект ответа?


person azmeuk    schedule 31.05.2017    source источник


Ответы (3)


Я не смог найти его в документации aiohttp, но вы можете использовать ssl, чтобы получить сертификат, и OpenSSL, чтобы получить его дату notAfter и сравнить ее с вашей текущей датой, чтобы выяснить, истек ли срок ее действия или нет. Подробнее здесь Как импортировать OpenSSL в python И фрагмент кода, который делает в значительной степени то, что вам нужно ниже. Однако вам нужно будет установить OpenSSL заранее

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

Для сайтов, использующих SNI, см. следующий ответ о том, как получить сертификат ssl.get_server_certificate для сайтов с SNI (индикация имени сервера)

person BoboDarph    schedule 31.05.2017
comment
Вам действительно не нужен OpenSSL. В serverlescode есть пример, который не требует этого (слишком длинный опубликовать в качестве комментария...) - person Alessandro Dentella; 28.08.2017
comment
Предупреждение: это не работает с SNI (несколько доменных имен на одном IP-адресе), поскольку сертификат просто извлекается с этого IP-адреса, который может быть другим. См. stackoverflow.com/questions/49132025/ для решения - person Daniel F; 12.08.2018
comment
socket никогда не используется. - person Pedro Lobito; 03.03.2020
comment
Обратите внимание, что этот метод не асинхронный. - person Romuald Brunet; 21.07.2020

Предыдущие ответы верны, но вы также можете использовать библиотеку сокетов (это тест с 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)

введите описание изображения здесь

person grepit    schedule 30.09.2018
comment
Я предпочитаю этот ответ, он не требует извлечения внешнего пакета, и вывод на самом деле более разумен для меня; почему OpenSSL требует вызова метода get_notAfter() и get_notBefore()? Это должны быть просто свойства сертификата... - person JTW; 28.06.2019

Проверьте этот репозиторий под названием check-tls-certs. На самом деле это не aiohttp, но он основан на asyncio и поэтому работает асинхронно.

person dio    schedule 07.06.2017