我正在尝试从智能卡中读取公共证书名称以在用户使用 gemalto 智能卡签署文件之前显示给用户。我遵循了 iaikPkcs11Wrapper 演示中的 getInfo 示例,如下所示:
Module pkcs11Module = Module.getInstance(settings.getCryptoDll());
Slot[] slotList;
try{
slotList = pkcs11Module.getSlotList(true);
}catch(TokenException tex){//module is not initialised
tex.printStackTrace();
pkcs11Module.initialize(new DefaultInitializeArgs());
slotList = pkcs11Module.getSlotList(true);
}
for (Slot slot : slotList) {
Token token = slot.getToken();
iaik.pkcs.pkcs11.Session session = token.openSession(true, SessionReadWriteBehavior.RO_SESSION, null, null);
session.findObjectsInit(null);
Object[] objects = new Object[0];
try {
objects = session.findObjects(1);
这总是在objects = findObjects(1);
出现 CKR_TEMPLATE_INCONSISTENT 异常的那一行失败。
正如我从文档中了解到的那样,session.findObjectsInit(null)
应该只返回卡上所有可访问的对象,然后您可以比较它们的类型。
我有各种智能卡,它们都像这样失败,我还尝试session.findObjectsInit(tempObj)
使用 GenericTemplate 对象和 X509PublicKeyCertificate 调用它们都返回相同的异常,并使用 X509AttributeCertificate 调用它不返回任何对象但不抛出异常。
我很感激任何人都可以提供的任何指示。还是我需要使用 GenericTemplate 创建匹配的模板对象?我不确定为什么会出现异常,因为我认为将对象传递给为该对象过滤的 getObjectInit 方法,因此返回的任何内容都应该匹配。
编辑 我随后尝试使用其他模板和不在卡片上的对象的模板只返回一个空数组 - 没有例外,我认为卡片上的那些只是抛出 ckr_template_inconsistent 异常,任何帮助将不胜感激。
EDIT2 我现在尝试使用一些新的“V3”卡,它们确实可以工作,我所有的测试卡都使用另一种技术工作(我们目前通过 com4J 使用 capicom 进行签名),所以也许 iaik 包装器存在问题,或者gclib.dll(或我)。