【发布时间】:2013-02-06 11:21:50
【问题描述】:
我需要使用 Windows 证书存储中存在的证书签署 PDF 文档。我整天都在挖掘,试图弄清楚,我如此接近但如此遥远。
缺少的是:我如何获得一个 IExternalSignature 对象来签署 PDF 文件?
Rahul Singla 编写了一个漂亮的示例,说明如何使用新的 iText 5.3.0 API 签署 PDF 文档 - 只要您可以访问 PC 上某处的 .pfx 文件.
a previous question 使用来自 Windows Cert Store 的证书进行签名,但它使用的 API 版本仍然存在 SetCrypto,并且签名显然是可选的。在 iText 5.3.0 中,API 发生了变化,SetCrypto 不再是东西。
这是我到目前为止所拥有的(为后代添加了 cmets,因为这可能是关于如何在网络上执行此操作的最完整和最新的版本):
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using BcX509 = Org.BouncyCastle.X509;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Crypto;
using DotNetUtils = Org.BouncyCastle.Security.DotNetUtilities;
...
// Set up the PDF IO
PdfReader reader = new PdfReader(@"some\dir\SomeTemplate.pdf");
PdfStamper stamper = PdfStamper.CreateSignature(reader,
new FileStream(@"some\dir\SignedPdf.pdf", FileMode.Create), '\0');
PdfSignatureAppearance sap = stamper.SignatureAppearance;
sap.Reason = "For no apparent raisin";
sap.Location = "...";
// Acquire certificate chain
var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadOnly);
X509CertificateCollection certCollection =
certStore.Certificates.Find(X509FindType.FindBySubjectName,
"My.Cert.Subject", true);
X509Certificate cert = certCollection[0];
// iTextSharp needs this cert as a BouncyCastle X509 object; this converts it.
BcX509.X509Certificate bcCert = DotNetUtils.FromX509Certificate(cert);
var chain = new List<BcX509.X509Certificate> { bcCert };
certStore.Close();
// Ok, that's the certificate chain done. Now how do I get the PKS?
IExternalSignature signature = null; /* ??? */
// Sign the PDF file and finish up.
MakeSignature.SignDetached(sap, signature, chain, // the important stuff
null, null, null, 0, CryptoStandard.CMS);
stamper.Close();
如你所见:除了签名之外我什么都有,我不知道该如何获得它!
【问题讨论】:
-
非常有用。谢谢!
标签: c# pdf certificate itextsharp signing