我正在通过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();
答案 0 :(得分:2)
您需要将密钥设置为可提取才能工作。 这是因为翻译后的密钥被临时存储在hsm中。
为此,您可以:
广告位管理器类的代码示例:
slotManager = LunaSlotManager.getInstance();
slotManager.login(user, pwd);
slotManager.setSecretKeysExtractable(true);