Java 带XMLSignature的XML签名

Java 带XMLSignature的XML签名,java,xml,xml-signature,pkcs#11,Java,Xml,Xml Signature,Pkcs#11,我们有一个web应用程序,它需要使用令牌对XML进行签名。我们安装了驱动程序并从“Windows MY”访问证书。但每次我们调用signature.sign(dsc);此时会出现一个窗口,询问密码。是否可以使用方法符号并将PIN作为参数传递以避免该窗口 用于签名的方法: XMLSignature signature = sig.newXMLSignature(si, ki); signature.sign(dsc); 如果您通过带有“Windows MY”的SUNMSCAPI访问安全令牌,您

我们有一个web应用程序,它需要使用令牌对XML进行签名。我们安装了驱动程序并从“Windows MY”访问证书。但每次我们调用signature.sign(dsc);此时会出现一个窗口,询问密码。是否可以使用方法符号并将PIN作为参数传递以避免该窗口

用于签名的方法:

XMLSignature signature = sig.newXMLSignature(si, ki); 
signature.sign(dsc);

如果您通过带有“Windows MY”的SUNMSCAPI访问安全令牌,您将向特定的CSP供应商驱动程序提供身份验证,因此您不能提供PIN作为方法参数。如果要以编程方式提供PIN,可以直接使用PKCS11Provider访问安全令牌:

// First configure the Sun PKCS#11 provider. It requires a stream (or file)
// containing the configuration parameters - "name" and "library".
String smartCardDriverPath = "...lib\libpkcs11.so";
String pkcs11ConfigSettings = "name = SmartCardTest\n" + "library = " + smartCardDriverPath;
byte[] pkcs11ConfigBytes = pkcs11ConfigSettings.getBytes();
final ByteArrayInputStream confStream = new ByteArrayInputStream(pkcs11ConfigBytes);

// instantiate provider
SunPKCS11 pkcs11 = pkcs11 = new SunPKCS11(confStream);
Security.addProvider(pkcs11);   

// generate the keystore and provide the password
char[] pwd = "your_pass".toCharArray(); 
KeyStore ks = KeyStore.getInstance("PKCS11",pkcs11);
ks.load(null, pwd); 
然后可以从密钥库中提取密钥,避免在密码窗口中输入用于实现签名的密钥

有关java中PKCS11的更多信息,请查看:

希望这有帮助