C# &引用;“至少有一个签名无效”;
我正在尝试使用itextsharp对pdf进行数字签名,而不生成物理文件。我正在将我的rdlc数据转换成字节,并尝试对其进行数字签名。当我创建物理文件并对该文件进行签名时,它已正确签名,但当我尝试登录memorystream而不在任何位置生成物理文件时,我会遇到此错误 至少有一个签名无效 我认为问题在于这一行C# &引用;“至少有一个签名无效”;,c#,itext,C#,Itext,我正在尝试使用itextsharp对pdf进行数字签名,而不生成物理文件。我正在将我的rdlc数据转换成字节,并尝试对其进行数字签名。当我创建物理文件并对该文件进行签名时,它已正确签名,但当我尝试登录memorystream而不在任何位置生成物理文件时,我会遇到此错误 至少有一个签名无效 我认为问题在于这一行 var ms = new MemoryStream(10 * 1024) 分析示例PDF问题的原因是OP签名的PDF被加密,而嵌入的签名容器也被加密 虽然ISO 32000-1在这方
var ms = new MemoryStream(10 * 1024)
分析示例PDF问题的原因是OP签名的PDF被加密,而嵌入的签名容器也被加密 虽然ISO 32000-1在这方面有点混乱,但ISO 32000-2明确规定,不得对嵌入式签名容器进行加密。(您可以在一个有关验证加密PDF中签名的相关问题中详细了解这一点。) 在就此发表评论后,OP确认: 删除PdfEncryptor代码后,现在我没有收到任何错误
请共享一个由您的代码签名的示例pdf进行分析。@mkl截图附在“错误”上方@Aalok mkl要求提供示例pdf,而不是错误截图。截图不是示例pdf。通常在创建pdf签名出现问题的情况下,通过快速分析签名的pdf本身,可以明确在何处查找错误。OK。我今天晚些时候在办公室的时候会查这个文件。
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();
}
}