Я использую класс 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)
Я обязан перезапустить свое приложение.
Как я могу повторно инициализировать провайдера, чтобы снова связаться со службой без перезапуска приложения?