nFast服务重启而不影响应用程序

时间:2017-05-29 08:42:37

标签: service cryptography pkcs#11 hsm

我使用sunPkcs11类将我的应用程序连接到NetHsm。 我的本地服务nFast在端口9004上运行。它用作与NetHsm通信的桥接器。

我的提供商设置如下:

Provider provider =  new sun.security.pkcs11.SunPKCS11(pkcs11ConfigFile);  // name = nCipher, library = D:\Program\nCipher\nfast\toolkits\pkcs11\cknfast-64.dll

我这样破译:

KeyStore ks = KeyStore.getInstance("PKCS11", provider);
ks.load(null, password);
Key key = ks.getKey(keyId, null);
IvParameterSpec paramSpec = new IvParameterSpec(iv);
AlgorithmParameters algParams = AlgorithmParameters.getInstance("AES");
algParams.init(paramSpec);
Cipher ci = Cipher.getInstance("AES/CBC/NoPadding", provider);
ci.init(Cipher.DECRYPT_MODE, key, algParams);
ci.doFinal(dataToDecipher);

一切都是对的,我可以破译我的钥匙。

现在,我停止服务nFast。我得到一个例外,因为我无法破译我的密钥。正常...

java.security.ProviderException: update() failed
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_DEVICE_ERROR

我重启了服务,我希望能够再次解密我的密钥,但我得到一个例外:

java.security.ProviderException: update() failed
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_GENERAL_ERROR
at sun.security.pkcs11.wrapper.PKCS11.C_FindObjectsInit(Native Method)
at sun.security.pkcs11.P11KeyStore.findObjects(P11KeyStore.java:2673)
at sun.security.pkcs11.P11KeyStore.mapLabels(P11KeyStore.java:2288)
at sun.security.pkcs11.P11KeyStore.engineLoad(P11KeyStore.java:770)

我有义务重启我的应用。

如何重新初始化提供程序,以便在不重新启动应用程序的情况下再次与服务进行通信?

2 个答案:

答案 0 :(得分:0)

Java KeyStore api没有一种简洁的方法来完成与PKCS#11设备的会话。当您创建提供程序实例时,它会使用令牌初始化会话,并且在使用KeyStore api完成与令牌的交互后,您无法完成打开的会话。

如果在重新启动服务之前完成打开的会话,则可能不会遇到此问题。如果您必须再次重新初始化会话(您必须再次创建提供程序实例)。

您可以参考我的回答here,在那里我能够解决与会话相关的类似问题。

由于KeyStore api不提供类似finalize的方法,您可以从上述帖子中进行以下解决方法。

PKCS11 pkcs11 = PKCS11.getInstance(((sun.security.pkcs11.SunPKCS11) provider).getProperty("pkcs11LibraryPath"), null, null, true);
pkcs11.C_Finalize(PKCS11Constants.NULL_PTR);

请注意我为setProperty实例所做的provider

答案 1 :(得分:0)

always_a_rookie_to_learn 的相同方式,我找到了最终解决方案。

感谢另一篇帖子here

我现在可以通过在每次调用时清除会话和令牌来多次打开提供者。太糟糕了,C_Finalize不在moduleMap中完成工作。

37/6