Java IAIK Pkcs11 包装程序生成的密钥未保留
Java IAIK Pkcs11 Wrapper generated key is not persisted
有人可以帮忙解决以下问题吗?
我正在使用:
- Windows
的 SoftHSM
- IAIK Pkcs11 Java 连接到 SoftHSM 的包装器 (v.1.4)
我的 Java 应用程序按以下步骤生成 AES 密钥:
- PKCS11 Session 已打开,已执行登录。
- AES 密钥生成成功。
- 正在搜索此密钥 - 已找到。
- 关闭 session.
但是如果我打开新的 session,我就再也找不到密钥了 - 当我关闭 session 时它就消失了,并且不会保留到 HSM。
我做错了吗?
申请代码为:
import java.io.IOException;
import iaik.pkcs.pkcs11.Mechanism;
import iaik.pkcs.pkcs11.Module;
import iaik.pkcs.pkcs11.Session;
import iaik.pkcs.pkcs11.Slot;
import iaik.pkcs.pkcs11.Token;
import iaik.pkcs.pkcs11.TokenException;
import iaik.pkcs.pkcs11.objects.AESSecretKey;
import iaik.pkcs.pkcs11.objects.Object;
import iaik.pkcs.pkcs11.wrapper.PKCS11Constants;
public class GenerateKeyAes {
public static void main(String[] args) throws IOException, TokenException {
// Init module and select slot and token
Module module = Module.getInstance("C:\prog\SoftHSM2\lib\softhsm2.dll");
module.initialize(null);
Slot slot = module.getSlotList(Module.SlotRequirement.TOKEN_PRESENT)[0];
Token token = slot.getToken();
// Create session and login
Session session = token.openSession(Token.SessionType.SERIAL_SESSION, Token.SessionReadWriteBehavior.RW_SESSION,
null, null);
session.login(Session.UserType.USER, "1111".toCharArray());
// Prepare key template
Mechanism keyGenerationMechanism = Mechanism.get(PKCS11Constants.CKM_AES_KEY_GEN);
AESSecretKey secretKeyTemplate = new AESSecretKey();
secretKeyTemplate.getValueLen().setLongValue(new Long(32));
secretKeyTemplate.getLabel().setCharArrayValue("AES secret 1".toCharArray());
secretKeyTemplate.getId().setByteArrayValue(new byte[] { 105 });
secretKeyTemplate.getSign().setBooleanValue(Boolean.TRUE);
secretKeyTemplate.getVerify().setBooleanValue(Boolean.TRUE);
secretKeyTemplate.getToken().setBooleanValue(Boolean.FALSE);
// Create key
AESSecretKey secretKey = (AESSecretKey) session.generateKey(keyGenerationMechanism, secretKeyTemplate);
System.out.println("Key generated:");
System.out.println(secretKey.toString());
System.out.println();
// Find all objects to ensure that generated key was really created
AESSecretKey template = new AESSecretKey();
session.findObjectsInit(template);
Object[] obs = session.findObjects(10);
System.out.println("Found objects: " + obs.length);
System.out.println();
// Key is found and displayed here!!!
for (Object ob : obs) {
System.out.println("Found object:");
System.out.println(ob);
System.out.println();
}
// Close session
session.findObjectsFinal();
session.closeSession();
// If I open new session here and perform same search - no key is found!
module.finalize(null);
}
}
PKCS#11 对象可以按其生命周期和可见性分类为:
令牌对象(CKA_TOKEN
属性设置为 true
的对象)。
它们对所有连接到具有足够权限的令牌的应用程序都是可见的,并且即使在会话(应用程序和令牌之间的连接)关闭并且令牌从其插槽中删除后仍保留在令牌上。
会话对象(CKA_TOKEN
属性设置为 false
的对象)
它们更临时——无论何时以任何方式关闭会话,该会话创建的所有会话对象都会自动销毁。此外,会话对象仅对创建它们的应用程序可见。
我不熟悉 IAIK 包装器,但您似乎正在将密钥创建为会话对象。
我会尝试改变:
secretKeyTemplate.getToken().setBooleanValue(Boolean.FALSE);
到
secretKeyTemplate.getToken().setBooleanValue(Boolean.TRUE);
有关详细信息,请参阅 PKCS#11 v2.20 specification。
有人可以帮忙解决以下问题吗?
我正在使用:
- Windows 的 SoftHSM
- IAIK Pkcs11 Java 连接到 SoftHSM 的包装器 (v.1.4)
我的 Java 应用程序按以下步骤生成 AES 密钥:
- PKCS11 Session 已打开,已执行登录。
- AES 密钥生成成功。
- 正在搜索此密钥 - 已找到。
- 关闭 session.
但是如果我打开新的 session,我就再也找不到密钥了 - 当我关闭 session 时它就消失了,并且不会保留到 HSM。
我做错了吗?
申请代码为:
import java.io.IOException;
import iaik.pkcs.pkcs11.Mechanism;
import iaik.pkcs.pkcs11.Module;
import iaik.pkcs.pkcs11.Session;
import iaik.pkcs.pkcs11.Slot;
import iaik.pkcs.pkcs11.Token;
import iaik.pkcs.pkcs11.TokenException;
import iaik.pkcs.pkcs11.objects.AESSecretKey;
import iaik.pkcs.pkcs11.objects.Object;
import iaik.pkcs.pkcs11.wrapper.PKCS11Constants;
public class GenerateKeyAes {
public static void main(String[] args) throws IOException, TokenException {
// Init module and select slot and token
Module module = Module.getInstance("C:\prog\SoftHSM2\lib\softhsm2.dll");
module.initialize(null);
Slot slot = module.getSlotList(Module.SlotRequirement.TOKEN_PRESENT)[0];
Token token = slot.getToken();
// Create session and login
Session session = token.openSession(Token.SessionType.SERIAL_SESSION, Token.SessionReadWriteBehavior.RW_SESSION,
null, null);
session.login(Session.UserType.USER, "1111".toCharArray());
// Prepare key template
Mechanism keyGenerationMechanism = Mechanism.get(PKCS11Constants.CKM_AES_KEY_GEN);
AESSecretKey secretKeyTemplate = new AESSecretKey();
secretKeyTemplate.getValueLen().setLongValue(new Long(32));
secretKeyTemplate.getLabel().setCharArrayValue("AES secret 1".toCharArray());
secretKeyTemplate.getId().setByteArrayValue(new byte[] { 105 });
secretKeyTemplate.getSign().setBooleanValue(Boolean.TRUE);
secretKeyTemplate.getVerify().setBooleanValue(Boolean.TRUE);
secretKeyTemplate.getToken().setBooleanValue(Boolean.FALSE);
// Create key
AESSecretKey secretKey = (AESSecretKey) session.generateKey(keyGenerationMechanism, secretKeyTemplate);
System.out.println("Key generated:");
System.out.println(secretKey.toString());
System.out.println();
// Find all objects to ensure that generated key was really created
AESSecretKey template = new AESSecretKey();
session.findObjectsInit(template);
Object[] obs = session.findObjects(10);
System.out.println("Found objects: " + obs.length);
System.out.println();
// Key is found and displayed here!!!
for (Object ob : obs) {
System.out.println("Found object:");
System.out.println(ob);
System.out.println();
}
// Close session
session.findObjectsFinal();
session.closeSession();
// If I open new session here and perform same search - no key is found!
module.finalize(null);
}
}
PKCS#11 对象可以按其生命周期和可见性分类为:
令牌对象(
CKA_TOKEN
属性设置为true
的对象)。
它们对所有连接到具有足够权限的令牌的应用程序都是可见的,并且即使在会话(应用程序和令牌之间的连接)关闭并且令牌从其插槽中删除后仍保留在令牌上。会话对象(
CKA_TOKEN
属性设置为false
的对象)
它们更临时——无论何时以任何方式关闭会话,该会话创建的所有会话对象都会自动销毁。此外,会话对象仅对创建它们的应用程序可见。
我不熟悉 IAIK 包装器,但您似乎正在将密钥创建为会话对象。
我会尝试改变:
secretKeyTemplate.getToken().setBooleanValue(Boolean.FALSE);
到
secretKeyTemplate.getToken().setBooleanValue(Boolean.TRUE);
有关详细信息,请参阅 PKCS#11 v2.20 specification。