初始化后如何完成SunPKCS11 Provider?

我通过以下方式初始化了SunPKCS11提供程序:

Provider provider = new sun.security.pkcs11.SunPKCS11("path_to_pkcs11.cfg");

Security.addProvider(provider);

然后,我使用此提供程序初始化KeyStore,以将密钥用于密码操作。

KeyStore ks = KeyStore.getInstance("PKCS11", provider);

ks.load(null, "password".toCharArray());

密码操作完成后,

我曾尝试删除该提供程序,但没有成功。

Security.removeProvider("sunPCKS11ProviderName");

下次我尝试与令牌通信时,我从令牌 *

我努力了

sun.security.pkcs11.SunPKCS11.logout();

但它也不起作用。

我有一个用例,其中必须同时使用PKCS#11包装程序和提供程序。为了能够使用包装器,我必须完成提供程序的确定,否则CKR_CRYPTOKI_ALREADY_INITIALIZED

当包装器尝试与令牌通信时,令牌会引发错误。

我正在使用Sun的PKCS#11提供程序和IAIK的PKCS#11包装程序。

public static void providerAndWrapperIssue() throws Exception

{

final String name = "ANY_NAME";

final String library = "LOCATION OF THE TOKENS DLL/SO";

final String slot = "SLOT NUMBER";

// SUN PKCS#11 Provider -------------------------------------------

StringBuilder builder = new StringBuilder();

builder.append("name=" + name);

builder.append(System.getProperty("line.separator"));

builder.append("library=\"" + library + "\"");

builder.append(System.getProperty("line.separator"));

builder.append("slot=" + slot);

ByteArrayInputStream bais = new ByteArrayInputStream(builder.toString().getBytes());

Provider provider = new sun.security.pkcs11.SunPKCS11(bais);

Security.addProvider(provider);

KeyStore ks = KeyStore.getInstance("PKCS11");

ks.load(null, null);

Enumeration<String> aliases = ks.aliases();

while (aliases.hasMoreElements())

System.out.println(aliases.nextElement());

// IAIK PKCS#11 Wrapper -------------------------------------------

Module pkcs11Module = Module.getInstance(library, false);

pkcs11Module.initialize(null); <-- Exception here.

Slot[] slots = pkcs11Module.getSlotList(true);

Session session = slots[0].getToken().openSession(true, true, null, null);

session.login(Session.UserType.USER, "".toCharArray());

session.logout();

session.closeSession();

slots[0].getToken().closeAllSessions();

pkcs11Module.finalize(null);

}

由于Sun的提供程序没有注销并关闭会话,因此IAIK无法访问令牌。而且Java的Keystoreapi没有注销方法。

回答:

终于能够找到解决方案。Sun的提供程序在下面使用包装器。因此,诀窍是使用Sun的PKCS#11包装器来获取当前实例并完成该实例。显然,此会话功能的最终确定未在提供程序中公开。但是有一个解决方法,它看起来像这样:

public static void providerAndWrapperIssue() throws Exception

{

final String name = "ANY_NAME";

final String library = "LOCATION OF THE TOKENS DLL/SO";

final String slot = "SLOT NUMBER";

// SUN PKCS#11 Provider -------------------------------------------

StringBuilder builder = new StringBuilder();

builder.append("name=" + name);

builder.append(System.getProperty("line.separator"));

builder.append("library=\"" + library + "\"");

builder.append(System.getProperty("line.separator"));

builder.append("slot=" + slot);

ByteArrayInputStream bais = new ByteArrayInputStream(builder.toString().getBytes());

Provider provider = new sun.security.pkcs11.SunPKCS11(bais);

provider.setProperty("pkcs11LibraryPath", library);

Security.addProvider(provider);

KeyStore ks = KeyStore.getInstance("PKCS11");

ks.load(null, null);

Enumeration<String> aliases = ks.aliases();

while (aliases.hasMoreElements())

System.out.println(aliases.nextElement());

// ====================================

// Solved it using the SUN PKCS#11 Wrapper

PKCS11 pkcs11 = PKCS11.getInstance(((sun.security.pkcs11.SunPKCS11) provider).getProperty("pkcs11LibraryPath"), null, null, true);

pkcs11.C_Finalize(PKCS11Constants.NULL_PTR);

// ====================================

// IAIK PKCS#11 Wrapper -------------------------------------------

Module pkcs11Module = Module.getInstance(library, false);

pkcs11Module.initialize(null);

Slot[] slots = pkcs11Module.getSlotList(true);

Session session = slots[0].getToken().openSession(true, true, null, null);

session.login(Session.UserType.USER, "".toCharArray());

session.logout();

session.closeSession();

slots[0].getToken().closeAllSessions();

pkcs11Module.finalize(null);

}

以上是 初始化后如何完成SunPKCS11 Provider? 的全部内容, 来源链接: utcz.com/qa/408607.html

回到顶部