使用IAIK PKCS11库在Bull HSM生成密钥报CKR_ATTRIBUTE_READ_ONLY错误如何解决
问题原因
你触发CKR_ATTRIBUTE_READ_ONLY错误的核心原因是调用CKM_AES_KEY_GEN密钥生成机制时,手动为密钥模板设置了value属性:CKM_AES_KEY_GEN是标准的HSM内部生成密钥的机制,密钥值由HSM硬件随机生成,不允许外部传入指定,value属性在该生成场景下属于只读属性,强制赋值就会触发只读错误。
可行解决方案
方案1:需求为HSM内部生成随机AES密钥
直接删除密钥生成函数里的如下代码行即可:secretKeyTemplate.getValue().setByteArrayValue(keyValue);修改后重新运行即可正常生成持久化密钥,密钥值由HSM内部随机生成。
方案2:需求为导入外部已有的
keyValue作为HSM内的密钥
不要使用session.generateKey()方法,改用session.createObject()方法导入密钥,不需要指定生成机制,示例代码调整如下:private static AESSecretKey importAESKey(byte[] keyValue, String label, int keyLength, boolean token) throws TokenException { AESSecretKey secretKeyTemplate = new AESSecretKey(); secretKeyTemplate.getValueLen().setLongValue((long) keyLength); secretKeyTemplate.getLabel().setCharArrayValue(label.toCharArray()); secretKeyTemplate.getToken().setBooleanValue(token); secretKeyTemplate.getSensitive().setBooleanValue(Boolean.FALSE); secretKeyTemplate.getExtractable().setBooleanValue(Boolean.TRUE); secretKeyTemplate.getDerive().setBooleanValue(Boolean.TRUE); secretKeyTemplate.getModifiable().setBooleanValue(Boolean.TRUE); secretKeyTemplate.getEncrypt().setBooleanValue(Boolean.TRUE); secretKeyTemplate.getDecrypt().setBooleanValue(Boolean.TRUE); secretKeyTemplate.getUnwrap().setBooleanValue(Boolean.TRUE); secretKeyTemplate.getWrap().setBooleanValue(Boolean.TRUE); secretKeyTemplate.getSign().setBooleanValue(Boolean.TRUE); secretKeyTemplate.getVerify().setBooleanValue(Boolean.TRUE); // 导入场景下可以指定密钥值 secretKeyTemplate.getValue().setByteArrayValue(keyValue); // 调用createObject导入密钥 return (AESSecretKey) session.createObject(secretKeyTemplate); }
额外排查点
如果调整代码后仍报错,可检查当前登录的USER用户是否具备创建持久化密钥的权限,部分HSM默认限制普通USER用户的密钥创建权限,可尝试切换为SO(安全管理员)用户登录后重试。
内容的提问来源于stack exchange,提问作者zero
相关产品推荐
相关产品推荐

