我正在评估iText7,并且无法使用没有私钥的自签名证书签署pdf。
我试图这样做:
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindBySubjectName, "MyName", false);
var refDate = DateTime.MinValue;
X509Certificate2 certificate = certs[0];
var pk = DotNetUtilities.GetKeyPair(certificate.PrivateKey).Private; //how to do without private key ????
IExternalSignature pks = new PrivateKeySignature(pk, "SHA-256");
var bCert = DotNetUtilities.FromX509Certificate(certificate);
var chain = new Org.BouncyCastle.X509.X509Certificate[] {bCert};
using (var reader = new PdfReader(@"D:\Test\ToSign.pdf"))
using (var stream = new FileStream(@"D:\Test\Signed.pdf", FileMode.OpenOrCreate)) {
PdfSigner signer = new PdfSigner(reader, stream, false);
signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
}
我明白我应该使用私钥来确定谁签署了PDF,但是我们当前的PDF库是一个COM组件,它设法在没有任何私钥的情况下签署pdf。
你能告诉我怎么做吗?
此致
答案 0 :(得分:1)
正如评论中提到的其他人一样:当有公钥时,总会有一个私钥(你可能没有)。
但有一种可能性是您的COM组件正在使用公钥进行签名过程。在非对称加密中你可以
所以也许这个组件使用公钥(而不是私钥)进行签名,但是如前所述,你是不能够验证文档,因为在PDF签名(normaly)公钥附在签名上。如果任何PDF阅读器/库获取文档,则会在验证文档时出错。
要在iText中“模仿”该行为,您可以从证书中获取公钥并将其转换为私钥并将其用于签名。 然而,这没有任何意义,可能会创建无法验证的损坏的PDF文件。所以我建议反对它......