"At least one signature is invalid"
"At least one signature is invalid"
我正在尝试使用 itextsharp 对 pdf 进行数字签名而不生成物理文件。我正在将我的 rdlc 数据转换为字节并尝试对其进行数字签名。当我创建物理文件并对该文件进行签名时,它已正确签名,但是当我尝试登录内存流而不在任何地方生成物理文件时,我收到此错误。
At least one signature is invalid
我认为问题出在这一行
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, '[=12=]'))
{
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();
}
}
分析示例 PDF,发现问题的原因是 OP 签名的 PDF 被加密,嵌入的签名容器也被加密。
虽然 ISO 32000-1 在这方面有点令人困惑,但 ISO 32000-2 明确表示嵌入式签名容器不得加密。 (您可以在 中阅读关于验证加密 PDF 签名的相关问题的更多详细信息。)
在这方面发表评论后,OP 确认:
After removing PdfEncryptor code now i am not getting any error.
我正在尝试使用 itextsharp 对 pdf 进行数字签名而不生成物理文件。我正在将我的 rdlc 数据转换为字节并尝试对其进行数字签名。当我创建物理文件并对该文件进行签名时,它已正确签名,但是当我尝试登录内存流而不在任何地方生成物理文件时,我收到此错误。
At least one signature is invalid
我认为问题出在这一行
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, '[=12=]'))
{
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();
}
}
分析示例 PDF,发现问题的原因是 OP 签名的 PDF 被加密,嵌入的签名容器也被加密。
虽然 ISO 32000-1 在这方面有点令人困惑,但 ISO 32000-2 明确表示嵌入式签名容器不得加密。 (您可以在
在这方面发表评论后,OP 确认:
After removing PdfEncryptor code now i am not getting any error.