
Qualifizierte Zertifikate wurden schnell zu einem festen Bestandteil des Alltags. Und immer mehr Menschen wollen dieses "Biest" von innen sehen. Dies ist einerseits. Andererseits werden immer mehr Anwendungen entwickelt, in denen Informationen aus diesen Zertifikaten verwendet werden. Und dies sind nicht nur Attribute der TIN oder BIN des Inhabers oder Herausgebers des Zertifikats. Dies können Informationen darüber sein, welcher kryptografische Anbieter vom Zertifikatsinhaber (subjectSignTool-Attribut) zum Generieren eines privaten Schlüssels verwendet wurde oder auf dessen Grundlage zertifiziert bedeutet, dass ein Zertifizierungszentrum (CA) erstellt wurde, das ein Zertifikat ausgestellt hat. Wenn Sie ein Programm schreiben, das die ausgestellten Zertifikate analysiert, können Sie interessante Statistiken darüber sammeln, welche Tools zum Schutz kryptografischer Informationen von Zertifikatsinhabern verwendet werden und auf deren Grundlage (wenn auch weniger interessante) zertifizierte (oder nicht zertifizierte) Fonds-Zertifizierungsstellen bereitgestellt werden (Attribut issuerSignTools):

In den Freiflächen von Habr
wurde bereits erfolgreich
versucht, ein qualifiziertes Zertifikat
zu zerlegen. Leider betraf die Analyse nur das Erhalten der Attribute TIN, PSRN und SNILS, die Teil des definierten Namens DN (Distinguished Name) sind. Obwohl, warum leider? Der Autor hatte ein spezifisches Problem und es wurde gelöst. Wir möchten über Python auf die Attribute eines qualifizierten Zertifikats zugreifen und ein grafisches Dienstprogramm zum Anzeigen dieser Attribute bereitstellen.
Um auf die Attribute des Zertifikats zuzugreifen, verwenden wir das Paket
fsb795 . Das Paket ist sowohl für Pytho2 als auch für Python3 verfügbar, sowohl für Linux als auch für Windows. Um es zu installieren, führen Sie einfach den traditionellen Befehl aus:
Das Paket fsb795 erfordert die Pakete pyasn1 und pyasn1-modules. Wenn sie nicht installiert sind, wird daher versucht, sie zu installieren.
Für Python3 sieht dieser Befehl folgendermaßen aus:
Sie können auch die Installationspakete
python3 und
python2 herunterladen und lokal
installieren .
Der Name des Pakets weist in Analogie zu den Modulen aus dem Paket pyasn1-modules, z. B. rfc2459 usw., darauf hin, dass es für die Verwendung mit Zertifikaten ausgelegt ist, die den Anforderungen des Ordens des Bundessicherheitsdienstes der Russischen Föderation vom 27. Dezember 2011
Nr. 795 „Bei Genehmigung Anforderungen für die Form eines qualifizierten Zertifikats ... ".
Der Zugriff auf das Zertifikat im Paket fsb795 wird über die Zertifikatklasse implementiert:
Um eine Instanz eines Objekts für ein bestimmtes Zertifikat zu erstellen, reicht es aus, die folgende Anweisung auszuführen:
$ python Python 2.7.15 (default, May 23 2018, 14:20:56) [GCC 5.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>import fsb795 >>tek_cert = fsb795.Certificate(</ >) >>
Als Parameter wird beim Erstellen einer Instanz der Klasse ein Zertifikat angegeben, das entweder in einer PEM- oder DER-Datei oder als Zeichenfolge im PEM-Format vorliegen kann.
Nach der Erstellung hat jede Instanz vier Attribute: pyver, formatCert, cert_full und cert.
Mit dem pyver-Attribut können Sie überprüfen, wie das Parsen des Zertifikats verlaufen ist. Wenn pyver einer leeren Zeichenfolge entspricht, enthält die Datei oder Zeichenfolge kein Zertifikat. Andernfalls enthält das Pyver-Attribut die Python-Sprachversion:
>>> c1=fsb795.Certificate(' ') >>> if (c1.pyver == ''): ... print (' ') ... >>> c2 = fsb795.Certificate('/home/a513/cert_nss.der') >>> if (c2.pyver != ""): ... print(c2.pyver) ... 2 >>> print(c2.formatCert) DER >>>
Das formatCert-Attribut enthält beim erfolgreichen Erstellen einer Instanz der Certificate-Klasse den Datei- / Zeichenfolgenformattyp des Zertifikats. Es kann PEM oder DER sein. Warum dieses Attribut benötigt wird, wird unten klar.
Das Paket fsb795 wurde mit dem Paket
pyasn1 erstellt. Zwei Attribute blieben also ungeprüft. Das Attribut cert speichert das tbs-Zertifikat, das für die Verwendung mit dem Paket pyasn1 bereit ist. Ein anderes Attribut cert_full speichert das gesamte decodierte Zertifikat in Bezug auf rfc2459. Wir zeigen, wie Sie den Public-Key-Algorithmus mit dem Attribut cert und dem verbundenen Paket pyasn1 erhalten:
>>> pubkey = c2.cert['subjectPublicKeyInfo'] >>> ff = pubkey['algorithm'] >>> ff1 = ff['algorithm'] >>> print (ff1) 1.2.643.2.2.19 >>>
Am Ende wird es möglich sein, die Fähigkeiten des fsb795-Pakets zu bewerten, um Informationen über den öffentlichen Schlüssel eines qualifizierten Zertifikats zu erhalten.
Wenn eine Instanz der Zertifikatklasse erfolgreich erstellt wurde, stehen uns Methoden zur Verfügung, mit denen die erforderlichen Daten einfach aus dem Zertifikat abgerufen werden können. Alle Informationen zum öffentlichen Schlüssel erhalten Sie wie folgt:
>>> c3 = fsb795.Certificate('cert.der') >>> key_info=c3.publicKey() >>> for opt in key_info.keys(): ... val = str(key_info[opt]) ... print (opt + '=' + val) ... curve=1.2.643.2.2.36.0 hash=1.2.643.2.2.30.1 valuepk=5b785f86f0dd5316ba37c8440e398e83f2ec0c34478f90da9c0c8046d341ff66f9044cd00a0e25530 acefd51e6be852dbecacbaabc55e807be8e1f861658bd58 algo=1.2.643.2.2.19 >>>
Derzeit enthält die Zertifikatklasse die folgenden Methoden:
- subjectSignTool () - gibt eine Zeichenfolge mit dem Namen des Inhabers des Zertifikats für den Schutz kryptografischer Informationen zurück.
- issuerSignTool () - gibt eine Liste von vier Elementen mit kryptografischen Informationstools des Zertifikatsausstellers zurück;
- classUser () - gibt eine Zeichenfolge mit den Oids der Sicherheitsklassen des kryptografischen Informationsschutzzertifikats des Zertifikatsinhabers zurück, getrennt durch die Zeichen ";;";
- issuerCert () - gibt ein Wörterbuch mit Feldern und Werten des unterscheidenden Namens DN des Ausstellers des Zertifikats und einer Nummer zurück, die das Zertifikat identifiziert (2 - juristische Person);
- subjectCert () - gibt ein Wörterbuch mit den Feldern und Werten des definierten Namens DN des Zertifikatsinhabers und einer Nummer zurück, die das Zertifikat identifiziert (2 - juristische Person);
- publicKey () - gibt ein Wörterbuch zurück, das den Schlüsselwert ('valuepk') und die Schlüsselparameter ('Kurve' und 'Hash') enthält.
- signatureCert - gibt zwei Werte zurück: den Signaturalgorithmus und den Signaturwert;
- validityCert - gibt ein Wörterbuch mit zwei Schlüsseln 'not_after' und 'not_before' zurück;
- keyUsage () - gibt eine Liste der Schlüsselbereiche zurück;
- serialNumber () - gibt die Seriennummer des Zertifikats in Dezimalform zurück;
- PrettyPrint () - Gibt eine Zeichenfolge mit einem 'Ausdruck' des Zertifikats in Form von pyasn1 (self.cert_full.prettyPrint ()) zurück.
Der Spoiler enthält ein Testbeispiel, das die Arbeit dieser Methoden deutlich zeigt.
Testen Sie test795.py, um das Paket fsb795 zu testen import fsb795 certpem = """ -----BEGIN CERTIFICATE----- MIIG3DCCBougAwIBAgIKE8/KkAAAAAAC4zAIBgYqhQMCAgMwggFKMR4wHAYJKoZI hvcNAQkBFg9kaXRAbWluc3Z5YXoucnUxCzAJBgNVBAYTAlJVMRwwGgYDVQQIDBM3 NyDQsy4g0JzQvtGB0LrQstCwMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAxPzA9BgNV BAkMNjEyNTM3NSDQsy4g0JzQvtGB0LrQstCwLCDRg9C7LiDQotCy0LXRgNGB0LrQ sNGPLCDQtC4gNzEsMCoGA1UECgwj0JzQuNC90LrQvtC80YHQstGP0LfRjCDQoNC+ 0YHRgdC40LgxGDAWBgUqhQNkARINMTA0NzcwMjAyNjcwMTEaMBgGCCqFAwOBAwEB EgwwMDc3MTA0NzQzNzUxQTA/BgNVBAMMONCT0L7Qu9C+0LLQvdC+0Lkg0YPQtNC+ 0YHRgtC+0LLQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAMB4XDTE4MDcwOTE1MjYy NFoXDTI3MDcwOTE1MjYyNFowggFVMR4wHAYJKoZIhvcNAQkBFg9jb250YWN0QGVr ZXkucnUxITAfBgNVBAMMGNCe0J7QniDCq9CV0LrQtdC5INCj0KbCuzEwMC4GA1UE Cwwn0KPQtNC+0YHRgtC+0LLQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAMSEwHwYD VQQKDBjQntCe0J4gwqvQldC60LXQuSDQo9CmwrsxCzAJBgNVBAYTAlJVMRgwFgYD VQQIDA83NyDQnNC+0YHQutCy0LAxRDBCBgNVBAkMO9Cj0JvQmNCm0JAg0JjQm9Cs 0JjQndCa0JAsINCULjQsINCQ0J3QotCgIDMg0K3Qojsg0J/QntCcLjk0MRgwFgYD VQQHDA/Qsy7QnNC+0YHQutCy0LAxGDAWBgUqhQNkARINMTE0Nzc0NjcxNDYzMTEa MBgGCCqFAwOBAwEBEgwwMDc3MTA5NjQzNDgwYzAcBgYqhQMCAhMwEgYHKoUDAgIk AAYHKoUDAgIeAQNDAARAW3hfhvDdUxa6N8hEDjmOg/LsDDRHj5DanAyARtNB/2b5 BEzQCg4lUwrO/VHmvoUtvsrLqrxV6Ae+jh+GFli9WKOCA0AwggM8MBIGA1UdEwEB /wQIMAYBAf8CAQAwHQYDVR0OBBYEFMQYnG5GfYRnj2ehEQ5tv8Fso/qBMAsGA1Ud DwQEAwIBRjAdBgNVHSAEFjAUMAgGBiqFA2RxATAIBgYqhQNkcQIwKAYFKoUDZG8E Hwwd0KHQmtCX0JggwqvQm9CY0KDQodCh0JstQ1NQwrswggGLBgNVHSMEggGCMIIB foAUi5g7iRhR6O+cAni46sjUILJVyV2hggFSpIIBTjCCAUoxHjAcBgkqhkiG9w0B CQEWD2RpdEBtaW5zdnlhei5ydTELMAkGA1UEBhMCUlUxHDAaBgNVBAgMEzc3INCz LiDQnNC+0YHQutCy0LAxFTATBgNVBAcMDNCc0L7RgdC60LLQsDE/MD0GA1UECQw2 MTI1Mzc1INCzLiDQnNC+0YHQutCy0LAsINGD0LsuINCi0LLQtdGA0YHQutCw0Y8s INC0LiA3MSwwKgYDVQQKDCPQnNC40L3QutC+0LzRgdCy0Y/Qt9GMINCg0L7RgdGB 0LjQuDEYMBYGBSqFA2QBEg0xMDQ3NzAyMDI2NzAxMRowGAYIKoUDA4EDAQESDDAw NzcxMDQ3NDM3NTFBMD8GA1UEAww40JPQvtC70L7QstC90L7QuSDRg9C00L7RgdGC 0L7QstC10YDRj9GO0YnQuNC5INGG0LXQvdGC0YCCEDRoHkDLQe8zqaC3yHaSmikw WQYDVR0fBFIwUDAmoCSgIoYgaHR0cDovL3Jvc3RlbGVjb20ucnUvY2RwL2d1Yy5j cmwwJqAkoCKGIGh0dHA6Ly9yZWVzdHItcGtpLnJ1L2NkcC9ndWMuY3JsMIHGBgUq hQNkcASBvDCBuQwj0J/QkNCa0JwgwqvQmtGA0LjQv9GC0L7Qn9GA0L4gSFNNwrsM INCf0JDQmiDCq9CT0L7Qu9C+0LLQvdC+0Lkg0KPQpsK7DDbQl9Cw0LrQu9GO0YfQ tdC90LjQtSDihJYgMTQ5LzMvMi8yLTk5OSDQvtGCIDA1LjA3LjIwMTIMONCX0LDQ utC70Y7Rh9C10L3QuNC1IOKEliAxNDkvNy8xLzQvMi02MDMg0L7RgiAwNi4wNy4y MDEyMAgGBiqFAwICAwNBALvjFGhdFE9llvlvKeQmZmkI5J+yO2jFWTh8nXPjIpiL OutUew2hIZv15pJ1QM/VgRO3BTBGDOoIrq8LvgC+3kA= -----END CERTIFICATE----- """
Um ein Testbeispiel auszuführen, führen Sie einfach den folgenden Befehl aus:
$python test795.py
Mit dem fsb795-Paket war es selbstverständlich, in Python ein eigenständiges, plattformunabhängiges grafisches Dienstprogramm zum Anzeigen qualifizierter Zertifikate zu schreiben. Das Tkinter-Paket wurde als grafische Unterstützung verwendet:

Das Dienstprogramm
viewCertFL63 verfügt über drei Registerkarten. Auf der Registerkarte Über Zertifikat wird unter anderem die aktuelle Uhrzeit angezeigt. Wir werden unten darauf zurückkommen. Um ein Zertifikat auszuwählen, klicken Sie einfach auf die Schaltfläche "Auswählen":

Achten Sie auf die Schaltfläche (diejenigen, die unter Windows arbeiten, sehen diese Schaltfläche nicht), mit der Sie die sogenannten unsichtbaren Dateien / Verzeichnisse (ausgeblendet) ausblenden können. Damit diese Schaltfläche angezeigt wird, müssen die folgenden Befehle ausgeführt werden:
if sys.platform != "win32": root.tk.call('set', '::tk::dialog::file::showHiddenBtn', '1') root.tk.call('set', '::tk::dialog::file::showHiddenVar', '0')
Eine sehr nützliche Schaltfläche. Nach Auswahl eines Zertifikats hat die Registerkarte "Über Zertifikat" die folgende Form:


Was hier bemerkenswert ist, ist, dass, wenn das Zertifikat beim Anzeigen des Zertifikats abläuft, das Siegel auf dem Symbol in der oberen linken Ecke in zwei Hälften zerfällt. Jeder kann davon überzeugt sein, indem er die Uhr am Computer ein Jahr im Voraus neu anordnet.
Auf der Registerkarte "Details" können Sie die Merkmale des ausgewählten Attributs eines qualifizierten Zertifikats detailliert anzeigen:

Und schließlich ist die dritte Registerkarte "Text". Diese Registerkarte zeigt den Inhalt des gesamten Zertifikats an:

Zum Anzeigen des Zertifikats können Sie nicht nur Python (die Schaltfläche "Python"), sondern auch die Dienstprogramme openssl und pp der Network Serurity Services (NSS) verwenden. Wenn jemand diese Dienstprogramme nicht hat, kann das erste durch Sammeln von openssl mit Unterstützung für die russische Kryptographie erhalten werden. Bei Verwendung des Dienstprogramms pp sieht die Zertifikatausgabe folgendermaßen aus:

Oben haben wir das formatCert-Attribut der Certificate-Klasse des fsb795-Pakets erwähnt. Daher benötigen wir den Wert dieses Attributs, um das Format der Datei mit dem Zertifikat anzugeben, wenn dieses oder jenes Dienstprogramm ausgeführt wird. Das Aufrufen des Dienstprogramms pp mit dem PEM-Dateiformat sieht beispielsweise folgendermaßen aus:
$pp –tc –u –a –i < >
Die Option -a gibt das Format der PEM-Datei an. Für das DER-Format ist es nicht angegeben.
Der Parameter "–inform" für openssl wird auf die gleiche Weise eingestellt.
Mit der Schaltfläche Dienstprogramm wird der Pfad zu den Dienstprogrammen openssl oder pp angegeben.
ViewCertFL63-Dienstprogrammverteilungen finden Sie
hier .
Distributionen wurden mit dem Pyinstaller-Paket erstellt:
$python pyinstaller.py --noconsole -F viewCertFL63.py