スマート カードと 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 が閉じるときに、ドライバの PIN プロンプトを呼び出す呼び出しPDFStamper
を行うことです。C_Sign()
したがって、これがアプリケーションである場合、KeyStore
およびを取得するためにPrivateKey
、またドライバーの PIN 入力プロンプトが表示されたときに、署名する前に PIN を入力する必要があります。とにかくPINを2回要求することはありますか? 私はこのようなことに慣れていないのですが、これについて間違った方法をとっていますか?