简体   繁体   English

使用MSCAPI和ITEXT从USB令牌签名PDF

[英]Sign PDF from usb Token Using MSCAPI & ITEXT

can anyone give me a simle example of pdf signing from usb token using MSCAPI and ITEXT. 谁能给我一个使用MSCAPI和ITEXT从usb令牌进行pdf签名的简单示例。 I do not want to use a fixed ocsp string. 我不想使用固定的ocsp字符串。

I tried to follow this Digital Signature book but it did not work. 我试图遵循这本数字签名书,但是没有用。 My code was: 我的代码是:

        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");

And it is giving me following error: 它给了我以下错误:

        java.lang.NullPointerException

I tried use itext 5.2.1/itextpdf-5.3.5 and bcmail-jdk16-1.46, bcprov-jdk16-1.46.jar, bctsp-jdk16-1.46.jar. 我尝试使用itext 5.2.1 / itextpdf-5.3.5和bcmail-jdk16-1.46,bcprov-jdk16-1.46.jar,bctsp-jdk16-1.46.jar。

Can anyone help ? 有人可以帮忙吗? please ................ 请 ................

您正在将null值传递给load(),请尝试执行此操作

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

remove sap.setCrypto line. 删除sap.setCrypto行。 you don't need it. 您不需要它。

In the latest version, the setCrypo is replaced by the following lines: 在最新版本中,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);

You have to put bcprov-jdk15on-1.60.jar and bcpkix-jdk15on-1.60.jar in your classpath. 您必须将bcprov-jdk15on-1.60.jarbcpkix-jdk15on-1.60.jar放在类路径中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM