AdobeReader中签名显示为无效的问题
创始人
2024-07-28 12:00:59
0

在 PDF 文档中使用 PAdES 签名标准并设置签名属性

PAdES (PDF Advanced Electronic Signatures) 是 PDF 文档中的一种电子签名标准。为了解决 Adobe Reader 中签名显示为无效的问题,可以在 PDF 文档中使用 PAdES 标准进行签名,并设置签名属性。

以下是使用 iTextSharp 库在 C# 中实现 PAdES 签名的示例代码:

using iTextSharp.text.pdf.security;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.X509;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography.X509Certificates;

public void SignPdf(string sourcePdfPath, string outputPdfPath, X509Certificate2 certificate, string reason, string location) {
    var reader = new PdfReader(sourcePdfPath);
    using (var memoryStream = new MemoryStream()) {
        using (var stamper = PdfStamper.CreateSignature(reader, memoryStream, '\0', null, true)) {
            var appearance = stamper.SignatureAppearance;
            appearance.Reason = reason;
            appearance.Location = location;
            var privateKey = DotNetUtilities.GetKeyPair(certificate.PrivateKey).Private;
            var chain = new List { DotNetUtilities.FromX509Certificate(certificate) };
            var signature = new X509Certificate2Signature(certificate, "SHA-256");
            MakeSignature.SignDetached(appearance, signature, chain, null, null, null, 0, CryptoStandard.CMS);
        }
        File.WriteAllBytes(outputPdfPath, memoryStream.ToArray());
    }
}

在上面的示例代码中,SignPdf 方法接受源 PDF 文件路径、输出 PDF 文件路径、签名证书、签名原因和签名位置参数。方法使用 PdfStamper.CreateSignature 方法创建 PDF 文档的签名区域,并设置签名区域的外观、签名原因和签名位置。然后,将签名证书的私钥解析为 Org.BouncyCastle.Crypto.Parameters.AsymmetricKeyParameter 类型的变量,并将证书和签名算法 SHA-256 传递给 X509Certificate2Signature 实例。最后,使用 MakeSignature.SignDetached 方法对 PDF 文档进行签名,并使用 CryptoStandard.CMS 参数将签名保存为 PAdES 标准。

使用上述方法签名后的 PDF 文档将在 Adobe Reader 中显示为

相关内容

热门资讯

Android Studio ... 要解决Android Studio 4无法检测到Java代码,无法打开SDK管理器和设置的问题,可以...
安装tensorflow mo... 要安装tensorflow models object-detection软件包和pandas的每个...
安装了Laravelbackp... 检查是否创建了以下自定义文件并进行正确的配置config/backpack/base.phpconf...
安装了centos后会占用多少... 安装了CentOS后会占用多少内存取决于多个因素,例如安装的软件包、系统配置和运行的服务等。通常情况...
按照Laravel方式通过Pr... 在Laravel中,我们可以通过定义关系和使用查询构建器来选择模型。首先,我们需要定义Profile...
按照分类ID显示Django子... 在Django中,可以使用filter函数根据分类ID来筛选子类别。以下是一个示例代码:首先,假设你...
Android Studio ... 要给出包含代码示例的解决方法,我们可以使用Markdown语法来展示代码。下面是一个示例解决方案,其...
Android Retrofi... 问题描述:在使用Android Retrofit进行GET调用时,获取的响应为空,即使服务器返回了正...
Alexa技能在返回响应后出现... 在开发Alexa技能时,如果在返回响应后出现问题,可以按照以下步骤进行排查和解决。检查代码中的错误处...
Airflow Dag文件夹 ... 要忽略Airflow中的笔记本检查点,可以在DAG文件夹中使用以下代码示例:from airflow...