继续关于电子签名(以下称为电子签名)主题的对话,应该说是关于验证。 在上一篇文章中,我分析了任务中比较困难的部分-创建签名。 本文比较简单。 大多数代码是Crypto PRO .NET SDK中的示例的改编。 我们将根据GOST R 34.10-2001和GOST R 34.10-2012首先检查所有签名,为此,我们需要CRYPTO PRO。
我们的任务分为三个部分:单独的签名,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做到这一点的人发表评论:
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的评论以及任何有理由的批评。