带有iText7的数字签名

问题描述 投票:0回答:1

我尝试使用iText7实施数字签名时遇到问题。根据iText的文档和几个示例,我需要实现IExternalSignature (here),就像这样:IExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm);,但这是我得到异常的地方:

var pk = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(cert.PrivateKey).Private;

enter image description here

这基本上意味着“在当前状态下使用无效的密钥”(?)。

大多数示例来自旧版本的iText库和Java(我正在使用C#),我无法完全弄清楚。

我将非常感谢您提供任何提示。谢谢!

编辑:这里是一些示例代码,仅用于复制异常:

static void Main(string[] args)
    {
        string output = "D:/Development/TestApp/testOutputMoje.pdf";
        string input = "D:/Development/TestApp/testInput.pdf";

        PdfReader reader = new PdfReader(input);
        string digestAlgorithm = DigestAlgorithms.SHA256;

        List<X509Certificate2> oCertChain = new List<X509Certificate2>();

        //getting certificates from store
        X509Store store = new X509Store(StoreName.My);
        store.Open(OpenFlags.ReadOnly);
        foreach (var oCert in store.Certificates)
        {
            oCertChain.Add(oCert);
        }
        store.Close();

        //siginig with first certificate - just example
        var cert = oCertChain[0];   

        //exception here:
        var pk = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(cert.PrivateKey).Private; 

        X509Certificate[] bouncyCert = { Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate(cert) };

        StampingProperties stampProp = new StampingProperties();
        stampProp.PreserveEncryption();

        IExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm);

        PdfSigner signer = new PdfSigner(reader, new FileStream(output, FileMode.Create), stampProp);
        signer.SignDetached(signature, bouncyCert, null, null, null, 0, CryptoStandard.CADES);

        reader.Close();
    }

加上有关证书的更多信息(不幸的是我无法向您显示任何详细信息)

enter image description hereenter image description hereenter image description here

c# cryptography bouncycastle private-key itext7
1个回答
0
投票

问题出在证书中。必须将其标记为“可导出”。我不知道如何解决这种情况,但是在我的情况下,我以这种方式使用了自己的证书:

var cert = new X509Certificate2();
cert.Import(File.ReadAllBytes(@"C:\temp\certificate.cer"), "password", X509KeyStorageFlags.Exportable);

这有效。

您需要找到更改证书标志的方法。也许用store.Open(OpenFlags.MaxAllowed)起作用,但这不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.