使用java从usb令牌读取pfx文件

时间:2014-08-12 06:21:10

标签: java digital-signature pfx pkcs#12 e-token

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

3 个答案:

答案 0 :(得分:3)

用于签名的USB令牌的重点是,没有人可以从该设备读取密钥。因此,您将哈希发送到令牌,令牌将向您发送签名。

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

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

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

keytool -list -storetype Windows-MY

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

答案 1 :(得分: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);

    }

答案 2 :(得分:-2)

试试此代码

 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) {}
}
}