電子署名(以下、電子署名)のトピックに関する会話を続けると、検証について言及する必要があります。 前の記事で、タスクのより難しい部分、つまり署名の作成を分析しました。 この記事は少し簡単です。 ほとんどのコードは、Crypto PRO .NET SDKの例の適合です。 GOST R 34.10-2001およびGOST R 34.10-2012に従って、すべての署名を最初にチェックします。これには、CRYPTO PROが必要です。
私たちのタスクは3つの部分に分かれています:個別の署名、PDFの署名、MS Wordの署名。
分離された署名の検証:
コメントはすべてコード内にあります。証明書の取得に注意を向けるだけです。後で必要になります。 証明書を個別に確認します。
さて、try-catchや他の人が使用しているものですべてをラップすることを忘れないでください。 この例では、音量を下げるために意図的にこれを行いません
PDFでの署名検証。 ここにはiTextSharpが必要です(5.5.13を書いている時点での現在のバージョン):
using (MemoryStream fileStream = new MemoryStream(dataFileRawBytes)) using (PdfReader pdfReader = new PdfReader(fileStream)) { AcroFields acroFields = pdfReader.AcroFields;
繰り返しますが、特にコメントすることはありません。 Oidについて説明する必要がない限り、「1.2.840.113549.1.9.5」が署名日のOidです。
リストの最後はdocxで、おそらく最も簡単なオプションです。
using (MemoryStream fileStream = new MemoryStream(dataFileRawBytes)) using (Package filePackage = Package.Open(fileStream)) { PackageDigitalSignatureManager digitalSignatureManager = new PackageDigitalSignatureManager(filePackage); if (!digitalSignatureManager.IsSigned) {
次に、証明書を解析し、証明書のチェーン全体を検証します。 したがって、アセンブリはネットワークにアクセスできるユーザーの下で動作する必要があります。
そして、地獄が始まる、なぜなら Oidを介して証明書の所有者に関する情報を取得する方法がわからないため、文字列を解析します。 大声で笑う:サーカスが始まります。
しかし、真剣に、あなたはOid'sを通してこれを行う方法を知っている人にコメントすることを歓迎します:
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;
本質をよりよく理解するために、コードは可能な限り短くしています。
一般に、これですべてです。証明書からOidを取得することについてのコメントと、理由付けられた批判を待っています。