1

我正在尝试开发一个能够使用智能卡对文件进行数字签名的 Java 应用程序。

我以这种方式设置 PKCS#11 提供程序:

Security.addProvider(new IAIK());
Properties providerProperties = new Properties();
providerProperties.put("PKCS11_NATIVE_MODULE","path\\asepkcs.dll");
IAIKPkcs11 pkcs11Provider = new IAIKPkcs11(providerProperties);
Security.addProvider(pkcs11Provider);
 Module module = Module.getInstance("path\\asepkcs.dll");

在我阅读了之前加载到智能卡中的 KeyStore 之后,但是当我尝试使用创建数字签名的方法时,应用程序捕获了以下异常:

java.security.SignatureException: iaik.pkcs.pkcs11.wrapper.PKCS11Exception: CKR_DEVICE_ERROR                      
at iaik.pkcs.pkcs11.provider.signatures.ExternalHashSignature.pkcs11Sign(ExternalHashSignature.java:294)
at iaik.pkcs.pkcs11.provider.signatures.PKCS11Signature.engineSign(PKCS11Signature.java:638)
at java.security.Signature$Delegate.engineSign(Unknown Source)
at java.security.Signature.sign(Unknown Source)
at sii.tesi.firma.provasc.FirmaScK.main(FirmaScK.java:288)

我无法理解如何解决 CKR_DEVICE_ERROR。我使用以下方法作为标志:

Signature signAlg = Signature.getInstance("SHA1withRSA"); 
signAlg.initSign(privateKey); 
signAlg.update(toBeEncrypted); 
byte[] signatureValue = signAlg.sign(); 
4

2 回答 2

1

我修复了 CKR_DEVICE_ERROR。问题只是智能卡连接不良(Omnikey 6121 构建不良)

一个回形针将芯片卡在板上更紧,为我解决了这个问题。

于 2016-09-30T11:14:36.210 回答
0

你也使用了 Pkcs11Wrapper 吗?如果是这样,您是否指定了java.library.path? Wrapper 版本应与 Provider 版本匹配,或查看自述文件以获取更多详细信息。

关于您的代码,请指定 IAIK 提供程序:

Signature.getInstance("SHA1withRSA", iaikProvider)

并尝试像这样添加提供者:

IAIK.addAsProvider(false);

如果这无助于检查 pkcs11 模块生成的错误日志。

于 2014-08-16T17:23:15.397 回答