Utimaco HSM与Java应用集成问题:无法获取存储的密钥
Utimaco HSM Java集成密钥获取问题排查
1. 密钥存储代码的核心缺失
你提供的密钥存储片段未完成实际导入操作:
String device = "3001@127.0.0.1"; cxi = new CryptoServerCXI(device, 3000); cxi.logon("CXI_HMAC", "", "*******".getBytes()); String group = "test1"; CryptoServerCXI.KeyAttributes attr = new CryptoServerCXI.KeyAttributes(); attr.setAlgo(CryptoServerCXI.KEY_ALGO_AES); attr.setSize(256); attr.setName("CXI_AES_IMP_KEY"); attr.setGroup(group); final byte[] aesKeyBytes = MessageDigest.getInstance("SHA-256").digest(hsmKeyDTO.getMasterKey().getBytes()); System.out.println("aesKey: --------" + aesKeyBytes); CryptoServerCXI.KeyComponents comp = new CryptoServerCXI.KeyComponents(aesKeyBytes); // 缺少关键的导入调用,密钥并未存入HSM // 需添加: // CryptoServerCXI.Key importedKey = cxi.importKey(attr, comp);
没有执行importKey,HSM中根本不存在目标密钥,后续自然无法查找导出。
2. 密钥导出的逻辑错误
(1)HSM的密钥导出权限限制
Utimaco HSM默认禁止导出明文密钥(对称密钥/私钥),除非密钥在创建/导入时明确设置了setExportable(true)属性。如果你的密钥未开启该权限,exportKey调用会直接失败。
(2)exportKey方法的参数误用
你调用的exportKey(rsaKey, CryptoServerCXI.KEY_TYPE_PRIVATE, aesKey)是用AES密钥加密导出RSA私钥,得到的是加密后的密钥Blob,并非明文密钥。若要获取明文,需满足两个条件:
- 目标密钥已开启可导出属性
- 使用对应明文导出的重载方法
3. 密钥查找的匹配问题
cxi.findKey(attr)仅返回第一个匹配属性的密钥,若HSM中存在多个相似密钥,可能返回非目标密钥。需确保查找时的属性(group、name、algo、size等)与存储时完全一致。
修复步骤参考
步骤1:补全密钥导入流程
导入时开启可导出属性(若需后续导出明文):
// 开启密钥可导出权限 attr.setExportable(true); // 执行导入操作 CryptoServerCXI.Key importedKey = cxi.importKey(attr, comp);
步骤2:正确导出明文密钥
在密钥允许明文导出的前提下,使用对应重载方法:
// 导出明文AES密钥 byte[] plainAesKey = cxi.exportKey(aesKey, CryptoServerCXI.KEY_TYPE_SECRET); // 导出明文RSA私钥 byte[] plainRsaPrivateKey = cxi.exportKey(rsaKey, CryptoServerCXI.KEY_TYPE_PRIVATE);
步骤3:校验密钥属性一致性
确认查找密钥时的KeyAttributes与存储时完全匹配,包括可导出状态、密钥分组等细节。
内容的提问来源于stack exchange,提问作者Sthogari
相关产品推荐
相关产品推荐

