【问题标题】:Sign PDF from usb Token Using MSCAPI & ITEXT使用 MSCAPI 和 ITEXT 从 USB 令牌签署 PDF
【发布时间】:2013-05-15 07:25:41
【问题描述】:

谁能给我一个使用 MSCAPI 和 ITEXT 从 USB 令牌签署 pdf 的简单示例。我不想使用固定的 ocsp 字符串。

我试图遵循这个 Digital Signature book 但它不起作用。我的代码是:

        LoggerFactory.getInstance().setLogger(new SysoLogger());
        BouncyCastleProvider providerBC = new BouncyCastleProvider();
        Security.addProvider(providerBC);
        SunMSCAPI provdierMSCAP = new SunMSCAPI();
        Security.addProvider(provdierMSCAP);
        KeyStore ks = KeyStore.getInstance("Windows-MY");
        ks.load(null, null);

        String alias = (String)ks.aliases().nextElement();
        PrivateKey pk = (PrivateKey)ks.getKey(alias, null);
        Certificate[] chain = ks.getCertificateChain(alias);


        PdfReader pdfreader = new PdfReader("HelloWorld.pdf");
        FileOutputStream outputFile = new FileOutputStream("Signed.pdf");
        PdfStamper pdfstamper;

        pdfstamper =  PdfStamper.createSignature(pdfreader, outputFile, '\0', null, true);

        PdfSignatureAppearance sap = pdfstamper.getSignatureAppearance();
        sap.setCrypto(pk, chain, null, PdfSignatureAppearance.SELF_SIGNED);
        sap.setReason("Test");
        sap.setLocation("Dhaka");

        sap.setVisibleSignature(new Rectangle(10, 10, 50, 30), 1, "Test");
        pdfstamper.close();

        JOptionPane.showMessageDialog(null, "Successfully Signed");

它给了我以下错误:

        java.lang.NullPointerException

我尝试使用 itext 5.2.1/itextpdf-5.3.5 和 bcmail-jdk16-1.46、bcprov-jdk16-1.46.jar、bctsp-jdk16-1.46.jar。

谁能帮忙?请.....

【问题讨论】:

  • 你把证书路径放在哪里?
  • 它不是我要使用的证书 (p12) 文件。我想加载 USB 驱动程序(来自 MSCAPI - Microsoft Cryptographic API)......
  • 你的问题有矛盾。你说你读过我的书,但你仍在使用 setCrypto() 方法。如果你读过我的书,你就会知道这种方法不应该再使用了。
  • 天哪!!!你是作家“布鲁诺”吗?首先,感谢你写了这么棒的书。对于像我这样的新手来说,它是一个宝藏。我尝试了很多代码,但没有一个真正起作用。我也试过你的代码。上面的代码只是我尝试过的众多代码之一。另外,作为一个完全新手,我不应该说,但我认为主要问题是,usb 令牌的密码提示应该出现在哪里,它没有出现在那里。你能给我一个示例,我的 USB 令牌(epass 令牌 1000)会要求提供密码吗?非常感谢布鲁诺。你是一个传奇............

标签: java encryption itext digital-signature mscapi


【解决方案1】:

你正在将空值传递给 load(),试试这个

ks.load(new FileInputStream("certificate_path"), keystore_password.toCharArray());

【讨论】:

  • 是的,没错。但是,这本书和其他链接据说传递空值,所以它会提示为提供者提供密码(ikey/aladin/epass,我使用的是 epass)。我也已经使用过这种方法并成功使用了 p12 (certificate_path)。但不适用于 USB Token。感谢您的回复。
  • 是的,我正在努力。谢谢 NK123 :)
【解决方案2】:

删除 sap.setCrypto 行。你不需要它。

【讨论】:

    【解决方案3】:

    在最新版本中,setCrypo 被以下行替换:

    ExternalDigest digest = new BouncyCastleDigest();
    BouncyCastleProvider provider = new BouncyCastleProvider();
    ExternalSignature signature = new PrivateKeySignature(key, DigestAlgorithms.SHA256, provider.getName());
    MakeSignature.signDetached(sap, digest, signature, chain,   null, null, null, 0, CryptoStandard.CMS);
    

    您必须将 bcprov-jdk15on-1.60.jarbcpkix-jdk15on-1.60.jar 放入您的类路径中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      相关资源
      最近更新 更多