Java 使用MSCAPI从usb令牌签署PDF&;文字

Java 使用MSCAPI从usb令牌签署PDF&;文字,java,encryption,itext,digital-signature,mscapi,Java,Encryption,Itext,Digital Signature,Mscapi,谁能给我一个简单的例子,使用MSCAPI和ITEXT从usb令牌进行pdf签名。我不想使用固定的ocsp字符串 我试着跟着这个 但它没有起作用。我的代码是: LoggerFactory.getInstance().setLogger(new SysoLogger()); BouncyCastleProvider providerBC = new BouncyCastleProvider(); Security.addProvider(provide

谁能给我一个简单的例子,使用MSCAPI和ITEXT从usb令牌进行pdf签名。我不想使用固定的ocsp字符串

我试着跟着这个 但它没有起作用。我的代码是:

        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


有人能帮忙吗?请………

如果要将空值传递给load(),请尝试以下操作


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

在最新版本中,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.jar和bcpkix-jdk15on-1.60.jar放在类路径中。

您的证书路径放在哪里?我要使用的不是证书(p12)文件。我想加载usb驱动程序(来自MSCAPI-Microsoft Cryptographic API)…您的问题中存在矛盾。你说你读过我的书,但你仍然在使用setCrypto()方法。如果你读过我的书,你就会知道这种方法不应该再使用了。哦,我的上帝!!!你是作家布鲁诺吗?首先,谢谢你写了这么一本很棒的书。对于像我这样的新手来说,这是一笔财富。我尝试了很多代码,但没有一个真正起作用。我也试过你的代码。上面的代码只是我尝试使用的众多代码中的一个。另外,作为一个完全的新手,我不应该说,但我认为主要的问题是,usb令牌的密码提示应该出现在哪里,它不会出现在那里。你能给我一个我的USB令牌(epass令牌1000)要求提供密码的示例吗?非常感谢布鲁诺。你是一个传奇……是的,没错。但是,据说该书和其他链接传递空值,因此它将提示为提供者提供密码(ikey/aladin/epass,我正在使用epass)。此外,我已经使用了这种方法,并成功地使用了p12(证书路径)。但它不适用于USB令牌。谢谢你的回复。是的,我正在努力。谢谢:)
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);