Я расшифровываю файл p7m через API BouncyCastle, поддерживаемый Luna HSM. В одном месте все работает как шарм. Если я разверну один и тот же код в Jboss в режиме домена или на двух отдельных узлах, я получаю следующее: «LunaException: невозможно ввести ключ», а функция «C_UnwrapKey» возвращает 0x110 для ключа = xxxxxxx»
Обратите внимание, что дескриптор ключа не существует в hsm.
Я пытался использовать LunaProvider.jar в качестве системного глобального модуля, чтобы избежать проблем с загрузчиком классов, а также пробовал без него. Клиент настроен правильно. Если я запускаю приложение с двумя загрузочными экземплярами на двух физических узлах по отдельности, все работает. Запуск в автономном режиме tomcat также работает.
CMSEnvelopedData envelopedData = new CMSEnvelopedData(encEnvelopedData);
log.info("get recipient infos");
RecipientInformationStore recipients = envelopedData.getRecipientInfos();
log.info("get recipients size:{}",recipients==null?"null":recipients.size());
//avoid assigning keys to java attributes since the operations are on the hsm
RecipientInformation recipient = recipients.get(new JceKeyTransRecipientId((java.security.cert.X509Certificate)jcaProvider.getKeystore().getCertificate(alias)));
if (recipient != null) {
JceKeyTransEnvelopedRecipient trans=new JceKeyTransEnvelopedRecipient((PrivateKey)jcaProvider.getKeystore().getKey(alias,jcaProvider.getPwd().toCharArray()));
trans.setProvider("LunaProvider");
CMSTypedStream cmsTs= recipient.getContentStream(trans);
return cmsTs.getContentStream();
Вам нужно установить ключ как извлекаемый, чтобы работать. Это связано с тем, что переведенный ключ временно хранится в файле hsm.
Для этого можно:
Пример кода для класса диспетчера слотов:
slotManager = LunaSlotManager.getInstance();
slotManager.login(user, pwd);
slotManager.setSecretKeysExtractable(true);