расшифровка p7m с помощью CMS и Luna Hsm на Jboss - PullRequest
1 голос
/ 22 мая 2019

Я расшифровываю файл p7m через API BouncyCastle, поддержанный Luna HSM.В одном экземпляре все работает как чудо. Если я разверну один и тот же код в Jboss в доменном режиме или на двух отдельных узлах, я получу следующее: «LunaException: Невозможно ввести ключ» и функция «C_UnwrapKey» возвращает 0x110 для key = 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();

1 Ответ

2 голосов
/ 28 мая 2019

Для работы необходимо установить ключ как извлекаемый.Это связано с тем, что переведенный ключ временно хранится в hsm.

. Для этого можно:

  • добавить в java.security com.safenetinc.luna.provider.createExtractableKeys = true
  • с использованием класса LunaSlotManager установить ключи как извлекаемые

Пример кода для класса диспетчера слотов:

slotManager = LunaSlotManager.getInstance();

            slotManager.login(user, pwd);

            slotManager.setSecretKeysExtractable(true);
...