首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用iText7进行数字签名

使用iText7进行数字签名
EN

Stack Overflow用户
提问于 2019-01-15 19:52:45
回答 1查看 1.6K关注 0票数 0

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

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

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

大多数示例来自旧版本的iText库和Java (我使用的是C#),我不太明白。

如果有任何建议,我将不胜感激。谢谢!

编辑:下面是一些复制异常的示例代码:

代码语言:javascript
运行
复制
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();
    }

关于证书的更多信息(很遗憾,我不能向你展示任何细节)

EN

回答 1

Stack Overflow用户

发布于 2020-03-13 02:12:13

证书中有问题。它必须标记为“可导出”。我不知道如何解决这种情况,但在我的案例中,我使用了自己的证书:

代码语言:javascript
运行
复制
var cert = new X509Certificate2();
cert.Import(File.ReadAllBytes(@"C:\temp\certificate.cer"), "password", X509KeyStorageFlags.Exportable);

这是可行的。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54198299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档