我正在尝试从智能卡中读取公共证书名称,以便在使用金雅拓智能卡签署文件之前显示给用户。 我已经按照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)
应该只返回卡上的所有可访问对象,然后您可以将它们与类型进行比较。
我有各种智能卡,它们都像这样失败了,我也尝试用GenericTemplate对象和X509PublicKeyCertificate调用session.findObjectsInit(tempObj)
,它们都返回相同的异常,并且使用X509AttributeCertificate,它不返回任何对象但不返回抛出异常。
我很感激任何人都可以给出的任何指示。或者我需要使用GenericTemplate创建匹配的模板对象?我不确定为什么我得到异常,因为我认为将对象传递给为该对象过滤的getObjectInit方法,因此返回的任何内容都应匹配。
修改 我随后尝试使用其他模板和一些不在卡上的对象只返回一个空数组 - 没有例外,我认为卡片只是抛出ckr_template_inconsistent异常,任何帮助都会感激不尽。
EDIT2 我现在尝试使用一些新的'V3'卡,它们实际上工作,我的所有测试卡都使用另一种技术(我们目前使用capicom通过com4J进行签名),所以也许iaik包装器或gclib存在问题.dll(或我)。