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.
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
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
Recommended Posts