【问题标题】:"At least one signature is invalid"“至少一个签名无效”
【发布时间】:2020-11-05 05:31:03
【问题描述】:

我正在尝试使用 itextsharp 对 pdf 进行数字签名,而不生成物理文件。我正在将我的 rdlc 数据转换为字节并尝试对其进行数字签名。当我创建物理文件并签署该文件时,它已正确签署,但是当我尝试登录内存流而不在任何地方生成物理文件时,我会收到此错误。

至少一个签名无效

我认为问题在于这条线

var ms  = new MemoryStream(10 * 1024)

public static byte[] SignPdfFileMemory(byte[] bytes)
    {
        
        Stream stream = File.OpenRead(HttpContext.Current.Server.MapPath("SantoshKumar - Copy.pfx"));
        Pkcs12Store pk12 = new Pkcs12Store(stream, "1234".ToCharArray());
        stream.Dispose();
        string alias = null;
        foreach (string tAlias in pk12.Aliases)
        {
            if (pk12.IsKeyEntry(tAlias))
            {
                alias = tAlias;
                break;
            }
        }
        var pk = pk12.GetKey(alias).Key;
        iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(bytes);
        using (var ms  = new MemoryStream(10 * 1024))
        {
            using (iTextSharp.text.pdf.PdfStamper stamper = iTextSharp.text.pdf.PdfStamper.CreateSignature(reader, ms, '\0'))
            {
                iTextSharp.text.pdf.PdfSignatureAppearance appearance = stamper.SignatureAppearance;                    
                appearance.Reason = "MUMBAI";
                appearance.Location = "TEST";
                appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(20, 10, 170, 60),2 , "Icsi-Vendor");
                iTextSharp.text.pdf.security.IExternalSignature es = new iTextSharp.text.pdf.security.PrivateKeySignature(pk, "SHA-256");
                iTextSharp.text.pdf.security.MakeSignature.SignDetached(appearance, es, new Org.BouncyCastle.X509.X509Certificate[] { pk12.GetCertificate(alias).Certificate }, null, null, null, 0, iTextSharp.text.pdf.security.CryptoStandard.CMS);
                stamper.Close();
            }
            return ms.ToArray();
        }
       
        }

File

【问题讨论】:

  • 请分享一个由您的代码签名的示例 pdf 以供分析。
  • @mkl 截图附在“错误”上方
  • @Aalok mkl 要求提供示例 PDF,而不是错误屏幕截图。
  • 截图不是pdf示例。通常在创建 pdf 签名时出现问题,分析签名的 pdf 本身很快就会清楚在哪里寻找错误。
  • 好的。今天晚些时候我会在办公室查看文件。

标签: c# itext


【解决方案1】:

分析示例 PDF,发现问题的原因是 OP 签名的 PDF 已加密,而嵌入的签名容器也已加密。

虽然 ISO 32000-1 在这方面有点混乱,但 ISO 32000-2 明确规定不得对嵌入式签名容器进行加密。 (您可以在this answer 中阅读有关此内容的更详细信息,并阅读一个相关问题,重点是验证加密 PDF 中的签名。)

在这方面发表评论后,OP 确认:

现在删除 PdfEncryptor 代码后,我没有收到任何错误。

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 2020-10-09
    • 1970-01-01
    • 2022-01-13
    • 2022-01-13
    • 2016-01-20
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多