在Jboss上使用CMS和Luna Hsm解密p7m

时间:2019-05-22 12:14:39

标签: java jboss jce hsm

我正在通过Luna HSM支持的BouncyCastle api解密p7m文件。在一个单一的方面,所有的工作都像一个吊饰。如果我在域模式下的Jboss或两个单节点中部署相同的代码,则会得到以下结果: “ LunaException:无法注入密钥”,函数“ C_UnwrapKey”在密钥= xxxxxxx上返回0x110”

请注意,HSM上不存在密钥句柄

为了避免类加载器问题,我尝试将LunaProvider.jar用作系统全局模块,并且尝试了不使用。客户端配置正确。如果我在两个fisical节点上分别运行带有两个Boot实例的应用程序,那么所有工作都可以。在独立的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 个答案:

答案 0 :(得分:2)

您需要将密钥设置为可提取才能工作。 这是因为翻译后的密钥被临时存储在hsm中。

为此,您可以:

  • 添加到java.security com.safenetinc.luna.provider.createExtractableKeys = true
  • 使用LunaSlotManager类将密钥设置为可提取

广告位管理器类的代码示例:

slotManager = LunaSlotManager.getInstance();

            slotManager.login(user, pwd);

            slotManager.setSecretKeysExtractable(true);