Überprüfen Sie die Frist für die Erneuerung des SSL-Zertifikats mithilfe der Python3 M2Crypto-Bibliothek

Hintergrund

Wenn Sie in der Domäne, in der das Zertifikat von Let's Encrypt automatisch erneuert wird, das Handbuch befolgen, sollte das SSL-Zertifikat zum Zeitpunkt von weniger als 30 Tagen mit der Standardeinstellung erneuert werden, die Erneuerung wird jedoch ausgeführt. Ich habe es in ein Skript implementiert, weil ich überprüfen musste, ob es war. Tatsächlich wird Folgendes ausgeführt, indem die Konfigurationsdatei der zu überprüfenden Domänenliste eingespeist wird. Da jedoch die für die Implementierung verwendete M2Crypto-Bibliothek nicht ausführlich erläutert wurde, werde ich sie einschließlich der Aufzeichnung des tatsächlichen Vorgangs transkribieren. .. Ich wünschte, ich könnte es mit urllib implementieren, was ich gewohnt bin, aber ich wusste nicht, wie ich das SSL-Zertifikat überprüfen sollte, also habe ich die M2Crypto-Bibliothek verwendet.

Umgebung

Bibliothek zu verwenden

Python-Ausführungsumgebung

Mit Pyenv wurde eine Python3-Umgebung wie diese erstellt.

 pwd
/root/python3

 pyenv versions
  system
* 3.5.6 (set by /root/python3/.python-version)

 python -V
Python 3.5.6

Bestätigung des Ablaufdatums des SSL-Zertifikats

Wir bereiten vor, was Sie benötigen, während Sie den Datenstatus usw. im interaktiven interaktiven Modus überprüfen.

import ssl
import M2Crypto
import datetime

port = 443
 hostname = 'www.qiita.com' # Domain ist Ihre eigene.

cert = ssl.get_server_certificate((hostname, port))

x509 = M2Crypto.X509.load_cert_string(cert)

x509.get_subject().as_text()    # 'CN=qiita.com'

Aus diesem Bereich weiß ich nicht viel, weil ich nicht viel Dokumentation finden kann, also werde ich fortfahren, während ich verwendbare Methoden ausgrabe.

dir(x509)
 ['__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
 '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
 '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_ptr', '_pyfree', 'add_ext', 'as_der', 'as_pem',
 'as_text', 'check_ca', 'check_purpose', 'get_ext', 'get_ext_at', 'get_ext_count', 'get_fingerprint', 'get_issuer', 'get_not_after',
 'get_not_before', 'get_pubkey', 'get_serial_number', 'get_subject', 'get_version', 'm2_x509_free', 'save', 'save_pem', 'set_issuer',
 'set_issuer_name', 'set_not_after', 'set_not_before', 'set_pubkey', 'set_serial_number', 'set_subject', 'set_subject_name',
 'set_version', 'sign', 'verify', 'x509']

Ich habe get_not_after gefunden, das brauchbar zu sein scheint.

type(x509.get_not_after())         # <M2Crypto.ASN1.ASN1_TIME object at 0x7f26999f1940>

dir(x509.get_not_after())
 ['__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
 '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
 '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_ptr', '_pyfree', '_ssl_months', 'asn1_time',
 'get_datetime', 'm2_asn1_time_free', 'set_datetime', 'set_string', 'set_time']

Ich habe etwas namens get_datetime gefunden, das mit datetime ausgegeben werden kann.

type(x509.get_not_after().get_datetime())  # <class 'datetime.datetime'>

x509.get_not_after().get_datetime()        # datetime.datetime(2020, 4, 30, 12, 0, tzinfo=<Timezone: UTC>)

Da die Daten von datetime erfasst wurden, ist es in Ordnung, wenn Sie die datetime-Bibliothek verwenden, um das Zeitdelta zu ermitteln.

exp_date = x509.get_not_after().get_datetime()

now = datetime.datetime.now()            # datetime.datetime(2019, 11, 29, 10, 52, 24, 89337)

exp_date - now
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't subtract offset-naive and offset-aware datetimes

Es scheint, dass eine Subtraktion zwischen Datum und Uhrzeit nicht möglich ist, wenn die Zeitzonen angehängt sind. Referenz: Python-Zeitzone verarbeiten Also habe ich die Zeitzoneninformationen gekürzt und verglichen.

remaining_time = exp_date.replace(tzinfo=None) - now       # datetime.timedelta(53, 15629, 910663)

remaining_time.days
152

Ich konnte die verbleibenden Tage des SSL-Zertifikats erfolgreich erhalten.

Der endgültige Code ist unten. Es ist relativ kompakt.

import ssl
import M2Crypto
from cryptography import x509
from cryptography.hazmat.backends import default_backend
import datetime

port = 443
 hostname = 'www.qiita.com' # Bitte schreiben Sie es entsprechend um oder lesen Sie das Argument

cert = ssl.get_server_certificate((hostname, port))
x509 = M2Crypto.X509.load_cert_string(cert)
exp_date = x509.get_not_after().get_datetime()
now = datetime.datetime.now()
remaining_time = exp_date.replace(tzinfo=None) - now

print(remaining_time.days)
152

Referenzinformationen

Recommended Posts

Überprüfen Sie die Frist für die Erneuerung des SSL-Zertifikats mithilfe der Python3 M2Crypto-Bibliothek
Überprüfen Sie den Python-Codestil mit pep8
Installieren Sie die Python-Bibliothek auf Lambda mit [/ tmp]
Überprüfen Sie die Aktienkurse mit Slackbot mit Python
[Hyperledger Iroha] Erstellen Sie ein Konto mit der Python-Bibliothek
[Persönliches Memo] julia - Verwenden Sie die Python-Bibliothek mit julia unter Verwendung von PyCall
Aggregieren Sie die Testergebnisse mithilfe der QualityForward Python-Bibliothek
Akkorderkennung mit Chromagramm der Python Library Librosa
Einführung der Python Imaging Library (PIL) mit HomeBrew