Windows証明書ストアにある証明書を使用してPDFドキュメントに署名する必要があります。私はそれを理解しようと一日中掘り下げていました、そして私はとても近くにいますが、遠く離れています。
不足しているのはこれだけです:PDFファイルに署名するためのIExternalSignatureオブジェクトを取得するにはどうすればよいですか?
Rahul Singlaは、新しいiText 5.3.0 APIを使用してPDFドキュメントに署名する方法の美しい例を作成しました。ただし、PCのどこかにある.pfxファイルにアクセスできる場合に限ります。
Windows Cert Storeからの証明書を使用して署名することについての前の質問がありますが、それはSetCrypto
まだ存在するAPIのバージョンを使用しており、署名は明らかにオプションでした。iText 5.3.0では、APIが変更されており、SetCrypto
もはや問題ではありません。
これが私がこれまでに持っているものです(これはネット上でこれを行う方法の最も完全で最新のバージョンである可能性があるため、後世のためにコメントが追加されています):
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();
ご覧のとおり、私は署名以外のすべてを持っていますが、それをどのように取得するかについて困惑しています。