web-dev-qa-db-ja.com

SSL証明書の有効期限をaiohttpで確認する方法は?

たとえば、pyopensslを使用して有効期限などの証明書情報を取得する方法を知っていますが、aiohttp response object でそれを行うことは可能ですか?

9
azmeuk

私はaiohttpのドキュメントでそれを見つけることができませんでしたが、sslを使用して証明書を取得し、OpenSSLを使用してnotAfterの日付を取得し、それを現在の日付と比較して、期限切れかどうかを判断できます。詳細はこちら PythonでOpenSSLをインポートする方法 そして、以下で必要なことをほぼ実行するコードのスニペットただし、事前に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を使用するサイトの場合、証明書を取得する方法について次の回答を参照してください SNI(サーバー名表示)があるサイトの場合はssl.get_server_certificate

9
BoboDarph

以前の答えは正しいですが、ソケットlibを使用することもできます(これは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

check-tls-certs と呼ばれるこのリポジトリを確認します。これは実際にはaiohttpではありませんが、asyncioに基づいているため、非同期で動作します。

1
dio