Poursuivant la conversation sur le sujet des signatures électroniques (ci-après dénommées signature électronique), il convient de parler de vérification. Dans l'article précédent, j'ai analysé la partie la plus difficile de la tâche - créer une signature. Cet article est un peu plus simple. La plupart du code est une adaptation d'exemples du SDK Crypto PRO .NET. Nous vérifierons tout d'abord les signatures selon GOST R 34.10-2001 et GOST R 34.10-2012, pour cela nous avons besoin de CRYPTO PRO.
La tâche pour nous est divisée en 3 parties: une signature distincte, une signature en PDF et une signature en MS Word.
Vérification de la signature séparée:
Les commentaires sont tous dans le code, je vais seulement attirer votre attention sur l'obtention d'un certificat, nous en aurons besoin plus tard, car nous vérifierons le certificat séparément.
Eh bien, n'oubliez pas de tout emballer dans try-catch et autres en utilisant. Dans l'exemple, je ne le fais pas intentionnellement afin de réduire le volume
Validation de signature en PDF. Ici, nous avons besoin d'iTextSharp (la version actuelle au moment de la rédaction du 5.5.13):
using (MemoryStream fileStream = new MemoryStream(dataFileRawBytes)) using (PdfReader pdfReader = new PdfReader(fileStream)) { AcroFields acroFields = pdfReader.AcroFields;
Encore une fois, il n'y a surtout rien à commenter. Sauf si je dois dire à propos d'Oid, "1.2.840.113549.1.9.5" est l'Oid de la date de signature.
Et le dernier sur notre liste est docx, peut-être l'option la plus simple:
using (MemoryStream fileStream = new MemoryStream(dataFileRawBytes)) using (Package filePackage = Package.Open(fileStream)) { PackageDigitalSignatureManager digitalSignatureManager = new PackageDigitalSignatureManager(filePackage); if (!digitalSignatureManager.IsSigned) {
Nous allons maintenant analyser le certificat et valider toute la chaîne de certificats. Par conséquent, l'assembly doit fonctionner sous un utilisateur qui a accès au réseau.
Et puis l'enfer commence, car Je ne sais pas comment obtenir des informations sur le propriétaire du certificat via Oid, je vais donc analyser la chaîne. Riez plus fort: le cirque commence.
Mais sérieusement, vous êtes invités à commenter ceux qui savent le faire via Oid:
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;
Le code est le plus court possible, pour une meilleure compréhension de l'essence.
En général, c'est tout, j'attends des commentaires sur l'obtention d'Oid à partir du certificat et toute critique raisonnée.