pdf - 签署 PDF 文件

标签 pdf digital-signature digital-certificate x509certificate2

我使用iTextSharp来签署PDF文件。但Adobe Reader无法验证我的签名。我使用由证书颁发机构生成的 SHA-2 测试证书(我也尝试过 SHA-1)。我已经安装了根证书用于该机构的测试证书。

public static void SignHashed(X509Certificate2 card, Stream input, Stream output) {
    Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
    Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(card.RawData) };

    PdfReader reader = new PdfReader(input);
    PdfStamper stp = PdfStamper.CreateSignature(reader, output, '\0');
    PdfSignatureAppearance sap = stp.SignatureAppearance;
    sap.SignDate = DateTime.Now;
    sap.SetCrypto(null, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
    sap.Reason = "Testování";
    sap.Location = "Praha";
    sap.Acro6Layers = true;
    sap.Render = PdfSignatureAppearance.SignatureRender.GraphicAndDescription;
    PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
    dic.Date = new PdfDate(sap.SignDate);
    dic.Name = PdfPKCS7.GetSubjectFields(chain[0]).GetField("CN");
    if (sap.Reason != null) dic.Reason = sap.Reason;
    if (sap.Location != null) dic.Location = sap.Location;
    sap.CryptoDictionary = dic;
    int csize = 4000;
    Hashtable exc = new Hashtable();
    exc[PdfName.CONTENTS] = csize * 2 + 2;
    sap.PreClose(exc);

    System.Security.Cryptography.HashAlgorithm sha = new System.Security.Cryptography.SHA1CryptoServiceProvider();

    Stream s = sap.RangeStream;
    int read = 0;
    byte[] buff = new byte[8192];
    while ((read = s.Read(buff, 0, 8192)) > 0) {
        sha.TransformBlock(buff, 0, read, buff, 0);
    }
    sha.TransformFinalBlock(buff, 0, 0);
    byte[] pk = SignMsg(sha.Hash, card, false);

    byte[] outc = new byte[csize];

    PdfDictionary dic2 = new PdfDictionary();

    Array.Copy(pk, 0, outc, 0, pk.Length);

    dic2.Put(PdfName.CONTENTS, new PdfString(outc).SetHexWriting(true));
    sap.Close(dic2);
}

有人知道签署 PDF 的更好解决方案吗?

最佳答案

Adobe Reader 无法验证签名,因为需要在“高级”菜单的“管理可信身份”选项中将 CA 链导入到 Adob​​e Reader。 祝你好运!

关于pdf - 签署 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1803165/

相关文章:

java - Java 中的 PDF 注释

node.js - AWS4 S3 POST 签名计算失败示例

c# - m_safeCertContext 是无效句柄

java - 使用java代码将证书添加到 keystore

c# - 使用 itextsharp 签署多个 pdf,并且 token 每次都会提示输入 pin

javascript - 从 HTML 表单创建 PDF?后端还是前端应该负责?

c++ - 打印数字签名信息

excel - 使用数字证书自动启用宏?

iphone - 从 iOS 发送的 PDF 附件在 Outlook 邮件客户端中未正确显示

python - 如何使用python数字签名PDF?