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

decrypting p7m with CMS and Luna Hsm on Jboss

我正在通过 BouncyCastle api 解密 p7m 文件,由 Luna HSM 提供支持。在单个实例中,所有工作都像 charm.If 我在域模式下的 Jboss 或两个单个节点中部署相同的代码我得到以下信息: "LunaException: Unable to inject key" 和函数 'C_UnwrapKey' returns 0x110 on key=xxxxxxx

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

我曾尝试使用 LunaProvider.jar 作为系统全局模块以避免类加载器问题,也尝试过不使用。客户端配置正确。如果我 运行 应用程序在两个财务节点上分别具有两个 Boot 实例,所有 works.Running 独立 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 上。

要做到这一点,您可以:

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

插槽管理器的代码示例class:

slotManager = LunaSlotManager.getInstance();

            slotManager.login(user, pwd);

            slotManager.setSecretKeysExtractable(true);