Я знаю, как получить информацию о сертификате, такую как дата истечения срока действия, например, с помощью pyopenssl, но возможно ли это сделать с помощью aiohttp объект ответа?
Как проверить срок действия SSL-сертификата с помощью aiohttp?
Ответы (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 (индикация имени сервера)
socket
никогда не используется.
- person Pedro Lobito; 03.03.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)
Проверьте этот репозиторий под названием check-tls-certs. На самом деле это не aiohttp, но он основан на asyncio и поэтому работает асинхронно.