我知道如何使用pyopenssl获取证书信息,例如到期日期,但是是否可以使用aiohttp response object来完成?
答案 0 :(得分:9)
我在aiohttp的文档中找不到它,但你可以使用ssl获取证书和OpenSSL来获取它不是日期,并将它与你当前的日期进行比较,以确定它是否已过期。 更多细节在这里 How to import OpenSSL in 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 for sites with SNI (Server Name Indication)
答案 1 :(得分:1)
检查这个名为check-tls-certs的仓库。它并不是真正的aiohttp,但它基于asyncio,因此它可以异步工作。
答案 2 :(得分:1)
先前的答案是正确的,但您也可以使用套接字库(这是在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)