【问题标题】:Using eid-commons and itext - programmatically sign a pdf with a valid signature使用 eid-commons 和 itext - 以编程方式使用有效签名对 pdf 进行签名
【发布时间】:2016-10-25 19:03:13
【问题描述】:

我在 stackoverflow 上看到了一些类似的问题,但遗憾的是我无法找到解决方案。我相信我已经很接近了,但只是错过了正确的步骤。

我正在使用我的比利时 EID 卡,上面有我可以用来签署 PDF 的签名证书。

使用的 Maven 库:

be.fedict.commons-eid - 0.6.5
com.itextpdf - 5.5.10
org.bouncycastle - 1.55

代码如下:

 BeIDCardManager manager = new BeIDCardManager();

        manager.addBeIDCardEventListener(new BeIDCardEventsListener() {

       public void eIDCardInserted(CardTerminal arg0, BeIDCard arg1) {
            log.info("Inserted");
            try {
                dostuffwithmycard(arg1);
            } catch (Exception e) {
                e.printStackTrace();
            }
          }
       }

...

protected static void dostuffwithmycard(BeIDCard card) throws IOException, DocumentException, GeneralSecurityException {
        Security.addProvider(new BeIDProvider());
        KeyStore keyStore = KeyStore.getInstance("BeID");
        keyStore.load(null, null);
        PrivateKey authnPrivateKey = (PrivateKey) keyStore.getKey("Authentication", null);
        Signature signature = Signature.getInstance("SHA1withRSA");
        signature.initSign(authnPrivateKey);

        PdfReader reader = new PdfReader("C:\\Untitled.pdf");
        FileOutputStream os = new FileOutputStream( "C:\\temp\\Signed.pdf");
        PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
        PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
        appearance.setReason("Okay");
        appearance.setLocation("Home");
        appearance.setVisibleSignature(new Rectangle(36,748,144,780), 1, "sig");

        ExternalDigest digest = new BouncyCastleDigest();
        ExternalSignature sig = new PrivateKeySignature(authnPrivateKey,  "SHA1", "BeIDProvider");

        MakeSignature.signDetached(appearance, digest, sig, keyStore.getCertificateChain("Signature"), null, null, null, 0, CryptoStandard.CMS);
    }

我基本上是通过反复试验一起构建了这段代码。我已经得到它,以便我可以将我的签名实际放在 PDF 上(通过输入 PIN 解锁我的签名证书后),但是当我打开 PDF 时,它告诉我签名无效。我可以在签名上看到我的名字,但是当我尝试在 Adob​​e Reader 中验证它时,我收到了错误 0x2726

一定是我做错了什么,但我一直没能找到确切的原因。

【问题讨论】:

  • 您能分享一个示例签名文件吗?有人问我认为 itext 5.5.10 是使用不同的充气城堡版本构建的。您是否尝试过匹配版本?
  • 我已尝试通过您在 stackoverflow 配置文件中提供的电子邮件地址将签名的 pdf 通过电子邮件发送给您
  • iText 使用 BouncyCastle 1.49。而且我想已经有一个用beid签署pdf文件的项目了,我在办公室的时候会查一下。
  • @arnehehe 我收到了你的邮件并正在调查它,但你真的应该试试 pedrofb 的回答中的建议,这看起来很合理。
  • 我将项目降级为使用 BouncyCastle 1.49。使用 Pedrofb 的修复程序,我最终能够使用 1.49 和 1.55 正确签署 pdf。我将继续使用 1.49,但对于这种特殊情况,值得一提的是 1.49 和 1.55 都有效。谢谢

标签: pdf itext digital-signature


【解决方案1】:

您使用keyStore.getKey("Authentication", null) 获取密钥,使用keyStore.getCertificateChain("Signature") 获取证书链。看来您的卡有两个证书。那么Signature证书的公钥将与Authentication证书的私钥不匹配

尝试将PrivateKey authnPrivateKey = (PrivateKey) keyStore.getKey("Authentication", null);替换为

PrivateKey authnPrivateKey = (PrivateKey) keyStore.getKey("Signature", null);

【讨论】:

  • 做到了!谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多