4

我正在尝试使用 USB 电子令牌在 java 中签署 pdf 文档。我想从 USB 令牌安全网 (alladin etoken pro 72 k(Java)) 读取签名并使用 java 代码附加到 pdf。我已经完成了数字签名使用存储在我本地机器中的密钥进行签名。但我想知道如何使用 USB 电子令牌完成相同的操作。

4

3 回答 3

4

用于签名的 USB 令牌的全部意义在于,没有人可以从该设备读取密钥。因此,您将哈希发送到令牌,令牌会将签名发回给您。

为此,您需要一个可以与令牌对话的 JCE 提供者。这通常由 PKCS#11(令牌为此提供库)或令牌提供 MSCAPI 驱动程序(在 windows 下)完成。

两者都可以在 Java 下使用,PKCS#11 方式的设置可能有点复杂,但根据我的经验,自动签名更好,因为在 MSCAPI 情况下,您经常需要手动输入令牌 PIN。

如果您的令牌被 Windows 识别,则以下命令应查看并列出其密钥:

keytool -list -storetype Windows-MY

然后可以使用 Windows 密钥库来获取用于签名的密钥句柄,但您也可以使用它来导出公钥的副本。

于 2015-11-05T06:59:28.907 回答
1

您可以使用 SUN PKCS11 提供程序来引用 Etoken 中的密钥。您可以尝试以下代码

String pkcs11Config = "name=eToken\nlibrary=C:\\Windows\\System32\\eps2003csp11.dll";
java.io.ByteArrayInputStream pkcs11ConfigStream = new java.io.ByteArrayInputStream(pkcs11Config.getBytes());
    sun.security.pkcs11.SunPKCS11 providerPKCS11 = new sun.security.pkcs11.SunPKCS11("pkcs11Config");
    java.security.Security.addProvider(providerPKCS11);

// Get provider KeyStore and login with PIN
String pin = "12345678";
java.security.KeyStore keyStore = java.security.KeyStore.getInstance("PKCS11", providerPKCS11);
KeyStore keyStore=KeyStore.getInstance("PKCS11",providerPKCS11);
keyStore.load(null, pin.toCharArray());

// Enumerate items (certificates and private keys) in the KeyStore
java.util.Enumeration<String> aliases = keyStore.aliases();
String alias = null;
while (aliases.hasMoreElements()) {
    alias = aliases.nextElement();
    System.out.println(alias);

    }
于 2016-11-14T10:18:39.527 回答
-1

试试这个代码

 import com.lowagie.text.pdf.*;
 import com.lowagie.text.Rectangle;
 //import com.lowagie.text.pdf.pdfSignatureAppearance;
 //import com.lowagie.text.pdf.pdfStamper;
 import java.security.*;
 import java.io.*;
 import java.awt.*;
 import java.security.cert.*;
 import java.lang.*;

 import java.io.FileInputStream;
 import java.security.KeyStore;
 import java.security.cert.CertPath;
 import java.security.cert.CertificateFactory;
 import java.util.ArrayList;
 import java.util.List;



public class pdfsign1{
  public static void main(String args[]) {
try {
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream("my_private_key.pfx"), "my_password".toCharArray());
String alias = (String)ks.aliases().nextElement();
PrivateKey key = (PrivateKey)ks.getKey(alias, "my_password".toCharArray());
Certificate[] chain = ks.getCertificateChain(alias);[/b]
PdfReader reader = new PdfReader("original.pdf");
FileOutputStream fout = new FileOutputStream("signed.pdf");
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');
PdfSignatureAppearance sap = stp.getSignatureAppearance();
//sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
sap.setReason("I'm the author");
sap.setLocation("Lisbon");
// comment next line to have an invisible signature
sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);
stp.close();
  }
catch(Exception e) {}
}
}
于 2015-11-05T06:47:19.557 回答