我正在尝试使用智能卡和 iText 对 PDF 进行数字签名。我通读了有关如何使用 iText 签署文档的文档,并尝试自己使用他们的一些代码。下面是我正在使用的代码:
String pkcs11ConfigSettings =
"name = SmartCard\nlibrary = C:\\Program Files\\ActivIdentity\\ActivClient\\acpkcs201-ns.dll";
AuthProvider p =
new SunPKCS11(new ByteArrayInputStream(pkcs11ConfigSettings.getBytes()));
Security.addProvider(p);
KeyStore.PasswordProtection pp =
new KeyStore.PasswordProtection("012345".toCharArray());
KeyStore.Builder builder =
KeyStore.Builder.newInstance("PKCS11",p ,pp);
KeyStore ks = builder.getKeyStore();
Certificate[] cc = ks.getCertificateChain("Digital Signature Key");
PrivateKey pk = (PrivateKey)ks.getKey("Digital Signature Key", null);
OutputStream fos = new FileOutputStream("c:\\2.pdf");
PdfReader reader = new PdfReader(new FileInputStream(new File("C:\\1.pdf")));
PdfStamper stamper = PdfStamper.createSignature(reader, fos, '\0');
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setCrypto(pk, cc, null,PdfSignatureAppearance.SELF_SIGNED);
appearance.setVisibleSignature(new Rectangle(0, 0, 100, 100), 1,null);
stamper.close();
这种方法的问题是当 iText 关闭时,PDFStamper
它会C_Sign()
调用驱动程序的 PIN 提示。
因此,如果这是一个应用程序,它将要求我在签名之前输入我的 PIN,以便获得KeyStore
and PrivateKey
,以及在出现驱动程序的 PIN 输入提示时。反正有两次要求输入密码吗?我对这些东西有点陌生,我是不是走错了路?