Melanjutkan pembicaraan tentang topik tanda tangan elektronik (selanjutnya disebut tanda tangan elektronik), harus dikatakan tentang verifikasi. Pada artikel sebelumnya, saya menganalisis bagian yang lebih sulit dari tugas - membuat tanda tangan. Artikel ini sedikit lebih sederhana. Sebagian besar kode adalah adaptasi contoh dari Crypto PRO .NET SDK. Kami akan memeriksa terlebih dahulu semua tanda tangan sesuai dengan GOST R 34.10-2001 dan GOST R 34.10-2012, untuk ini kita perlu CRYPTO PRO.
Tugas kami dibagi menjadi 3 bagian: tanda tangan terpisah, tanda tangan dalam PDF dan tanda tangan dalam MS Word.
Verifikasi Tanda Tangan Terpisah:
Semua komentar ada dalam kode, saya hanya akan menarik perhatian Anda untuk mendapatkan sertifikat, kami akan membutuhkannya nanti, karena kami akan memeriksa sertifikat secara terpisah.
Nah, jangan lupa untuk membungkus semuanya dalam try-catch dan yang lainnya gunakan. Dalam contoh, saya sengaja tidak melakukan ini untuk mengurangi volume
Validasi tanda tangan dalam PDF. Di sini kita membutuhkan iTextSharp (versi saat ini pada saat penulisan 5.5.13):
using (MemoryStream fileStream = new MemoryStream(dataFileRawBytes)) using (PdfReader pdfReader = new PdfReader(fileStream)) { AcroFields acroFields = pdfReader.AcroFields;
Sekali lagi, tidak ada yang perlu dikomentari. Kecuali saya harus mengatakan tentang Oid, "1.2.840.113549.1.9.5" adalah Oid dari tanggal penandatanganan.
Dan yang terakhir dalam daftar kami adalah docx, mungkin opsi termudah:
using (MemoryStream fileStream = new MemoryStream(dataFileRawBytes)) using (Package filePackage = Package.Open(fileStream)) { PackageDigitalSignatureManager digitalSignatureManager = new PackageDigitalSignatureManager(filePackage); if (!digitalSignatureManager.IsSigned) {
Sekarang kita akan menguraikan sertifikat dan memvalidasi seluruh rantai sertifikat. Oleh karena itu, perakitan harus bekerja dari bawah pengguna yang memiliki akses ke jaringan.
Dan kemudian neraka dimulai, karena Saya tidak tahu cara mendapatkan informasi tentang pemilik sertifikat melalui Oid, jadi saya akan menguraikan string. Tertawa lebih keras: sirkus dimulai.
Tapi serius, Anda dipersilakan untuk mengomentari mereka yang tahu bagaimana melakukan ini melalui 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;
Kode ini sesingkat mungkin, untuk lebih memahami esensi.
Secara umum, ini saja, saya menunggu komentar tentang mendapatkan Oid dari sertifikat dan kritik apa pun yang beralasan.