Wenn Sie das Gespräch zum Thema elektronische Signaturen (im Folgenden als elektronische Signatur bezeichnet) fortsetzen, sollten Sie sich mit der Überprüfung befassen. Im vorherigen Artikel habe ich den schwierigeren Teil der Aufgabe analysiert - das Erstellen einer Signatur. Dieser Artikel ist etwas einfacher. Der größte Teil des Codes ist eine Anpassung von Beispielen aus dem Crypto PRO .NET SDK. Wir werden zunächst die Signaturen nach GOST R 34.10-2001 und GOST R 34.10-2012 prüfen, dafür benötigen wir CRYPTO PRO.
Die Aufgabe für uns gliedert sich in drei Teile: eine separate Signatur, eine Signatur in PDF und eine Signatur in MS Word.
Überprüfung der getrennten Unterschrift:
Alle Kommentare sind im Code enthalten. Ich werde Ihre Aufmerksamkeit nur darauf lenken, ein Zertifikat zu erhalten. Wir werden es später benötigen, da Wir werden das Zertifikat separat prüfen.
Vergessen Sie nicht, alles in Try-Catch und andere zu verpacken. Im Beispiel mache ich das absichtlich nicht, um die Lautstärke zu reduzieren
Signaturvalidierung in PDF. Hier benötigen wir iTextSharp (die aktuelle Version zum Zeitpunkt des Schreibens von 5.5.13):
using (MemoryStream fileStream = new MemoryStream(dataFileRawBytes)) using (PdfReader pdfReader = new PdfReader(fileStream)) { AcroFields acroFields = pdfReader.AcroFields;
Auch hier gibt es besonders nichts zu kommentieren. Sofern ich nicht zu Oid sagen muss, ist „1.2.840.113549.1.9.5“ die Oid des Unterzeichnungsdatums.
Und der letzte auf unserer Liste ist docx, vielleicht die einfachste Option:
using (MemoryStream fileStream = new MemoryStream(dataFileRawBytes)) using (Package filePackage = Package.Open(fileStream)) { PackageDigitalSignatureManager digitalSignatureManager = new PackageDigitalSignatureManager(filePackage); if (!digitalSignatureManager.IsSigned) {
Jetzt analysieren wir das Zertifikat und validieren die gesamte Zertifikatskette. Daher sollte die Assembly unter einem Benutzer funktionieren, der Zugriff auf das Netzwerk hat.
Und dann beginnt die Hölle, weil Ich weiß nicht, wie ich über Oid Informationen über den Zertifikatsinhaber erhalten kann, daher werde ich die Zeichenfolge analysieren. Lauter lachen: Der Zirkus beginnt.
Aber im Ernst, Sie können gerne diejenigen kommentieren, die wissen, wie man das durch Oids macht:
private static void FillElectronicSignature(X509Certificate2 certificate) { foreach (KeyValuePair<string, string> item in ParseCertificatesSubject(certificate.Subject)) { switch (item.Key) { case "C": string certificatesCountryName = item.Value; break; case "S": string certificatesState = item.Value; break; case "L": string certificatesLocality = item.Value; break; case "O": string certificatesOrganizationName = item.Value; break; case "OU": string certificatesOrganizationalUnitName = item.Value; break; case "CN": string certificatesCommonName = item.Value; break; case "E": string certificatesEmail = item.Value; break; case "STREET": string certificatesStreet = item.Value; break;
Der Code ist so kurz wie möglich, um das Wesentliche besser zu verstehen.
Im Allgemeinen ist dies alles, ich warte auf Kommentare zum Erhalt von Oid aus dem Zertifikat und auf begründete Kritik.