【问题标题】:Sign pdf using iText7 C#使用 iText7 C# 签署 pdf
【发布时间】:2019-01-01 23:10:25
【问题描述】:

我在文件中有一个用于 ex 的私钥。 “privatekey.pem”并且不知道如何创建ICipherParameters pk = ; 有人可以帮助我吗? 我正在尝试使用 iText7 签署 pdf。

using System;
using System.Drawing;
using System.Windows.Forms;
using Org.BouncyCastle.Crypto;
using System.Security.Cryptography.X509Certificates;
using iText.Signatures;
using System.IO;
using iText.Kernel.Pdf;
using Org.BouncyCastle.X509;
/* ..... */

    protected void SignTest2()
    {
        bool isAppendMode = false;
        string dest = "signtest.pdf";
        string source = "test.pdf";
        int certificationLevel = 1;
        string reason = "Test reason";
        string location = "Warsaw";
        bool setReuseAppearance = false;
        string name = "Test name";


        ICipherParameters pk = ;

        System.Security.Cryptography.X509Certificates.X509Certificate cert = new System.Security.Cryptography.X509Certificates.X509Certificate("fullchain.pem");
        X509Certificate2 signatureCert = new X509Certificate2(cert);
        Org.BouncyCastle.X509.X509Certificate bcCert = new X509CertificateParser().ReadCertificate(cert.GetRawCertData());

        Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[1] { bcCert };

        PdfReader reader = new PdfReader(source);
        StampingProperties properties = new StampingProperties();
        if (isAppendMode)
        {
            properties.UseAppendMode();
        }
        PdfSigner signer = new PdfSigner(reader, new FileStream(dest, FileMode.Create), true);
        signer.SetCertificationLevel(certificationLevel);
        PdfSignatureAppearance appearance = signer.GetSignatureAppearance().SetReason(reason).SetLocation(location
            ).SetReuseAppearance(setReuseAppearance);

        signer.SetFieldName(name);
        // Creating the signature
        IExternalSignature pks = new PrivateKeySignature(pk, "SHA-512");
        signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
    }

【问题讨论】:

  • 我相信 ITextSharp 文档/网站有一些有效的例子你看过那里的网站,看看是否有任何有效的例子来说明如何至少做到这一点?
  • 过去 5 个小时我一直在研究文档,不幸的是我没有找到任何可行的示例(我尝试了很多)
  • 拥有.pem 文件并不能保证您拥有私钥。请参阅serverfault.com/questions/9708 如果您确定它确实包含私钥;使用工具创建.p12 文件。 .p12 文件肯定包含一个公钥和一个私钥(并且还有一些其他优点)。我从未见过有人使用.pem 文件来签署文件。这可以解释为什么你会找到任何关于它的文档。
  • 我确定里面有 ptivate 键。即使这个stackoverflow.com/a/15901273/9004965 也不起作用。它在投射 (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject(); 时抛出“invalidcastexception”
  • 好的,我解决了。

标签: c# itext7


【解决方案1】:

好的,我找到了解决方案。如果您在“privkey.pem”文件中只有私钥,它就可以工作。

    private static AsymmetricKeyParameter readPrivateKey(string privateKeyFileName)
    {
        AsymmetricKeyParameter key;

        using (var reader = File.OpenText(privateKeyFileName))
        {
            PemReader pemReader = new PemReader(reader);
            key = (AsymmetricKeyParameter)pemReader.ReadObject();

        }
        return key;
    }

    protected void SignTest2()
    {
        bool isAppendMode = false;
        string dest = "signtest.pdf";
        string source = "test.pdf";
        int certificationLevel = 1;
        string reason = "Test reason";
        string location = "Warsaw";
        bool setReuseAppearance = false;
        string name = "Test name";


        //ICipherParameters pk = Pkcs12FileHelper.ReadFirstKey("privkey.pem", null, null);
        ICipherParameters pk = readPrivateKey("privkey.pem");
        System.Security.Cryptography.X509Certificates.X509Certificate cert = new System.Security.Cryptography.X509Certificates.X509Certificate("fullchain.pem");
        X509Certificate2 signatureCert = new X509Certificate2(cert);
        Org.BouncyCastle.X509.X509Certificate bcCert = new X509CertificateParser().ReadCertificate(cert.GetRawCertData());

        Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[1] { bcCert };
        //ICipherParameters pk = signatureCert.GetECDsaPrivateKey();

        PdfReader reader = new PdfReader(source);
        StampingProperties properties = new StampingProperties();
        if (isAppendMode)
        {
            properties.UseAppendMode();
        }
        PdfSigner signer = new PdfSigner(reader, new FileStream(dest, FileMode.Create), true);
        signer.SetCertificationLevel(certificationLevel);
        PdfSignatureAppearance appearance = signer.GetSignatureAppearance().SetReason(reason).SetLocation(location
            ).SetReuseAppearance(setReuseAppearance);

        signer.SetFieldName(name);
        // Creating the signature
        IExternalSignature pks = new PrivateKeySignature(pk, "SHA-512");
        signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS);
    }

【讨论】:

  • 请注意,.pem 密钥并不那么安全。如果此密钥可以被盗,则很容易滥用它。另外:使用软件密钥,您将永远不会在 Adob​​e Reader 中获得绿色复选标记。要获得绿色复选标记,您需要一个硬件令牌,其密钥由 AATL(Adobe 批准的信任列表)上的一个证书颁发机构提供。
  • 老实说,我知道合格签名的工作原理。我只是想检查我是否可以使用 ssl 证书签署文件
  • 知道这一点,但阅读你的问题和答案的人可能不知道,所以在你的答案中添加一个警告会很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 2013-08-28
相关资源
最近更新 更多