如何使用aiohttp检查SSL证书的到期日期?

时间:2017-05-31 09:23:32

标签: python ssl-certificate python-asyncio aiohttp

我知道如何使用pyopenssl获取证书信息,例如到期日期,但是是否可以使用aiohttp response object来完成?

3 个答案:

答案 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)

enter image description here