使用iText7签署没有私钥的PDF

时间:2017-01-04 10:13:08

标签: c# itext itext7

我正在评估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。

你能告诉我怎么做吗?

此致

1 个答案:

答案 0 :(得分:1)

正如评论中提到的其他人一样:当有公钥时,总会有一个私钥(你可能没有)。

但有一种可能性是您的COM组件正在使用公钥进行签名过程。在非对称加密中你可以

  • 使用私钥加密并使用公钥解密(称为用于PDF签名的数字签名)或
  • 您可以使用公钥加密并使用私钥解密(称为PGP中使用的加密)。

所以也许这个组件使用公钥(而不是私钥)进行签名,但是如前所述,你是能够验证文档,因为在PDF签名(normaly)公钥附在签名上。如果任何PDF阅读器/库获取文档,则会在验证文档时出错。

要在iText中“模仿”该行为,您可以从证书中获取公钥并将其转换为私钥并将其用于签名。 然而,这没有任何意义,可能会创建无法验证的损坏的PDF文件。所以我建议反对它......