
Trotz aller
Brände ist es an der Zeit, unsere Bürgerpflicht zu erfüllen - Steuern zu zahlen. Wir zahlen Steuern über das
State Services- Portal. Wir werden das persönliche Konto des State Services-Portals
mit einer elektronischen Signatur (
Terminologie des State Services-Portals) eingeben, d. H. mit einem Zertifikat, das bei einem akkreditierten Zertifizierungszentrum (CA) erworben wurde, und einem privaten Schlüssel. Beide speichere ich auf dem
PKCS # 11-Token mit Unterstützung für die russische Kryptographie:

Nachdem ich meine Bürgerpflicht erfüllt hatte, beschloss ich, die Funktion der elektronischen Signatur in der
libreoffice- Bürosuite erneut zu überprüfen.
Warum habe ich mich dazu entschieden? Für den Zugriff auf das Gosuslug-Portal verwende ich das Linux-Betriebssystem und den Redfox-Browser, einen Mozilla Firefox-Browser, der mit Unterstützung der russischen Kryptografie modifiziert wurde. Wie Sie wissen, verwendet die libreoffice Office Suite den NSS-Speicher auch als Zertifikatspeicher.
Der Redfox-52-Browser wurde im Ordner / usr / local / lib64 / Firefox-52 installiert.
Legen Sie den Wert der Variablen LD_LIBRARY_PATH wie folgt fest, um die Bibliotheken des NSS-Pakets (Network Security Services) mit Unterstützung für GOST-Algorithmen zu verbinden:
$export LD_LIBRARY_PATH=/usr/local/lib64/firefox-52:$LD_LIBRARY_PATH $
Als Zertifikatspeicher verwendet libreoffice normalerweise einen Zertifikatspeicher von Firefox, dem Thunderbird-E-Mail-Client oder dem integrierten Seamonkey-Paket. Nichts hindert Sie daran, den Zertifikatspeicher des GoogleChrome / Cromium-Browsers zu verwenden oder einen eigenen unabhängigen Speicher zu erstellen (Extras-> Optionen-> Sicherheit-> Zertifikat):

Nachdem der Speicher ausgewählt wurde, werden die Bibliotheken verbunden, führen libreoffice aus, erstellen eine Odt-Datei und versuchen, sie zu signieren (Datei-> Digitale Signaturen-> Digitale Signaturen).
Zertifikate im Firefox / NSS-Repository werden erfolgreich angezeigt und überprüft:

Die Signatur nach Auswahl des Zertifikats und Drücken der OK-Taste wird jedoch nicht gebildet:

Es scheint, dass libreoffice russische kryptografische Algorithmen nicht verstehen möchte, obwohl NSS vom Redfox-Browser verwendet wird, der GOST-Algorithmen versteht, was durch eine erfolgreiche Zertifikatsüberprüfung bestätigt wird.
Wir machen den zweiten Versuch: Dieses Mal werden wir versuchen, die PDF-Datei zu signieren. Exportieren Sie dazu das vorbereitete Dokument im PDF-Format. Um eine PDF-Datei zu signieren, müssen Sie sie natürlich herunterladen (Datei-> Digitale Signaturen-> PDF signieren). Nach dem Herunterladen versuchen wir, es zu signieren (Datei-> Digitale Signaturen-> Digitale Signaturen) (siehe oben, wählen Sie das Zertifikat aus und geben Sie beispielsweise den Zweck der Signatur des Dokuments an):

Und die Unterschrift wird gebildet !!! Wir sehen, dass die Signatur auf Basis des Zertifikats "Test 12 512" mit dem Schlüssel GOST R 34.10-2012 512 Bit bildet. Die Unterschrift ist korrekt.
Libreoffice verlassen. Führen Sie libreoffice erneut aus, laden Sie die signierte PDF-Datei und überprüfen Sie die Signaturen. Alles ok. Zertifikate von Unterzeichnern anzeigen. Alles ok. Wunder! Das Signieren von PDFs funktioniert. Wir setzen die zweite, dritte Unterschrift ... Alles funktioniert. Aber etwas verfolgt. Wir machen eine zusätzliche Prüfung.
Öffnen Sie die signierte PDF-Datei (ich habe den integrierten Editor von mc - Midnight Commander - Konsolendateimanager für Linux verwendet). Finden Sie die elektronische Signatur (/ Type / Sig /):

Wie Sie sehen können, wird die Signatur in symbolischer hexadezimaler Form gespeichert. Wir kopieren es und speichern es in einer Datei. Um die Datei in eine Binärdatei (DER-Codierung) zu konvertieren, verwenden wir das Dienstprogramm xxd:
$xxd –p –r < PDF> > <>.der $
Die resultierende Datei enthält eine nicht verbundene DER-codierte Signatur im PKCS # 7-Format. Jetzt kann diese Signatur mit jeder asn1-Prase angezeigt werden, beispielsweise mit dem Dienstprogramm openssl. Da es sich jedoch um das NSS-Paket handelt, verwenden wir das
Dienstprogramm derdump oder das
Dienstprogramm pp :
$pp –t p7 –u –i pkcs7_detach.p7 PKCS
Und dann wurde klar, dass nicht alles so gut ist. Ja, der Digest-Verschlüsselungsalgorithmus: GOST R 34.10-2012 Schlüssel 512-Signaturalgorithmus gemäß dem zum Signieren ausgewählten Zertifikat, aber die Signatur wird aus einem Hash generiert, der mit dem SHA-256-Algorithmus berechnet wurde (Digest-Algorithmus (1): SHA-256). Und das ist von dem Punkt aus falsch: Der Hash für GOST R 34.10-2012 Schlüssel 512 sollte gemäß dem GOST R 34.11-2012-512-Algorithmus berücksichtigt werden.
Kommen wir zur Analyse des libreoffice-Quellcodes: Der Teufel ist nicht so schrecklich, wie er gemalt ist. In diesem Artikel betrachten wir die Verwendung des NSS-Pakets zum Generieren einer elektronischen Signatur. Wenn jemand die MS Windows-Plattform bevorzugt, verwenden Sie CryptoAPI (und dementsprechend GOST-CSP) und kann in Analogie zu diesem Material die entsprechende Überarbeitung vornehmen.
Die Analyse ergab, dass die Änderungen nur in zwei Dateien vorgenommen werden müssen:
-
~ / libreoffice-5.3.7.2 / vcl / source / gdi / pdfwriter_impl.cxx-
~ / libreoffice-5.3.7.2 / xmlsecurity / source / pdfio / pdfdocument.cxxDiese Änderungen hängen mit der korrekten Auswahl der Hash-Funktion für GOST-Zertifikate zusammen. Die Auswahl einer Hash-Funktion hängt vom Typ des Zertifikatschlüssels ab. Die Auswahl eines Hash-Algorithmus, beispielsweise in PDFWriter :: Sign (Datei pdfwriter_impl.cxx), sieht folgendermaßen aus:
bool PDFWriter::Sign(PDFSignContext& rContext) { #ifndef _WIN32 SECKEYPublicKey *pubk = NULL; SECOidTag hashAlgTag; HASH_HashType hashType; int hashLen; CERTCertificate *cert = CERT_DecodeCertFromPackage(reinterpret_cast<char *>(rContext.m_pDerEncoded), rContext.m_nDerEncoded); if (!cert) { SAL_WARN("vcl.pdfwriter", "CERT_DecodeCertFromPackage failed"); return false; } /* */ pubk = CERT_ExtractPublicKey(cert); if (pubk == NULL) return NULL; /* */ switch(pubk->keyType){ case gost3410Key: hashAlgTag = SEC_OID_GOSTHASH; hashType = HASH_AlgGOSTHASH; hashLen = SHA256_LENGTH; break; case gost3410Key_256: hashAlgTag = SEC_OID_GOST3411_2012_256; hashType = HASH_AlgGOSTHASH_12_256; hashLen = SHA256_LENGTH; break; case gost3410Key_512: hashAlgTag = SEC_OID_GOST3411_2012_512; hashLen = SHA256_LENGTH * 2; hashType = HASH_AlgGOSTHASH_12_512; break; default: hashAlgTag = SEC_OID_SHA256; hashType = HASH_AlgSHA256; hashLen = SHA256_LENGTH; break; } /* */ HashContextScope hc(HASH_Create(hashType)); . . . }
Andere Änderungen in der Logik sind diesen ähnlich. Der Patch für die Datei ~ / libreoffice-5.3.7.2 / vcl / source / gdi / pdfwriter_impl.cxx befindet sich
Der Patch für die Datei ~ / libreoffice-5.3.7.2 / xmlsecurity / source / pdfio / pdfdocument.cxx befindet sich
Nachdem wir die Änderungen vorgenommen haben, erstellen wir das libreoffice-Paket. Die vorgenommenen Änderungen betrafen drei Bibliotheken (/ usr / lib64 / libreoffice / program):
- libvcllo.so ;
- libxmlsecurity.so ;
- libxsec-xmlsec.so
Diese drei Bibliotheken wurden in der installierten libreoffice-Distribution (/ usr / lib64 / libreoffice / program) ersetzt.
Danach verlief das Signieren und Überprüfen der GOST-Signatur in den PDF-Dateien reibungslos. Und hier an einer der Stellen fällt ein solcher Auszug auf:
Der Federal Tax Service bietet einen hervorragenden Service für die Erlangung eines Auszugs aus dem Unified State Register of Legal Entities für jede juristische Person und ist absolut kostenlos. Ein Auszug kann in Form eines PDF-Dokuments erhalten werden, das mit einer qualifizierten elektronischen Signatur signiert ist. Ein solcher Auszug kann an eine Geschäftsbank oder eine Regierungsbehörde gesendet werden, und Sie werden nicht in Papierform danach gefragt. Alles in allem sehr bequem.
Wir bestellen, erhalten und verifizieren:

Es sei daran erinnert, dass Sie nicht vergessen sollten, eine Kette vertrauenswürdiger Zertifikate für das Unterzeichnerzertifikat im Repository zu installieren. Das ist aber natürlich.
Das ist alles, jetzt besteht die Möglichkeit, eine elektronische Signatur (eine oder mehrere) in PDF-Dateien zu verwenden. Dies ist sowohl beim Koordinieren von Dokumenten als auch beim Speichern von Dokumenten sehr praktisch.
Und wenn jemand daran gewöhnt ist, mit der klassischen elektronischen Signatur im PKCS # 7-Format sowohl verbunden als auch getrennt zu arbeiten, wurde eine aktualisierte Version (für die Linux- und Windows-Plattformen) des
GUINSSPY -Grafikpakets
erstellt :

Die Entwicklung wurde in Python3 durchgeführt und wenn es auf der Linux-Plattform keine Probleme gab, musste ich unter MS Windows mit Codierungen schwitzen. In der Tat war es eine separate Entwicklung und dies erfordert einen separaten Artikel. All diese Nuancen sind im Quellcode zu sehen.
Mit diesem Dienstprogramm können Sie einen Zertifikatspeicher für libreoffice erstellen, Zertifikate verwalten, Dateien signieren usw.:

Mit dem Dienstprogramm können Sie auch eine Zertifikatanforderung mit der Generierung eines Schlüsselpaars erstellen, das dann an das Zertifizierungscenter übertragen werden kann, und das empfangene Zertifikat im Repository installieren:

Und wenn Hersteller von inländischen Linux-Gabeln verschiedene Pakete (NSS, Firefox, Thunderbiird, GnuPG / SMIME, SSH, KMail, Kleopatra, LibreOffice, OpenSSL usw. usw.) für die Arbeit mit russischer Kryptographie modifiziert haben, können Sie dies Es würde um Importsubstitution im Bereich der Kryptographie gehen.