初始化后如何完成SunPKCS11 Provider?

always_a_rookie_to_learn:

我通过以下方式初始化了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());

密码操作完成后,如何使用PKCS11令牌完成会话?

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

Security.removeProvider("sunPCKS11ProviderName");

下次我尝试与令牌通信时,我从令牌CKR_CRYPTOKI_ALREADY_INITIALIZED抛出了此异常

更新

我试过了

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没有注销方法。

always_a_rookie_to_learn:

终于能够找到解决方案。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);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Flutter Provider 重新初始化模型

使用自定义ChangeNotifier初始化riverpod Provider

Provider 被废弃后使用

NgDocs Provider如何使用?

如何正确设置 Provider?

为什么我的状态没有在 Flutter Consumer/Provider 中初始化?

Flutter Provider 包在 VSCode 中保存时重新初始化

Bean初始化完成后如何调用方法?

如何愚弄Java Service Provider API(JAXP)

如何向Google的Guice Provider提供参数?

LocationManager.NETWORK_PROVIDER 如何真正工作?

如何在React中使用Redux的Provider

如何顺序使用多个Terraform Provider

如何使用Provider来显示或隐藏FAB?

如何为Kubernetes配置'efs-provider'?

如何更改Terraform Provider.aws版本

对于在图像运行时初始化或重新初始化的类,图像堆中不允许有任何实例:sun.security.provider.NativePRNG

使用哪个初始化参数:jersey.config.server.provider.packages或javax.ws.rs.Application?

在 Content Provider 中定义并在 onCreate() 中初始化的全局变量在 query() 中为 null

使用AWS Cookbook时出现“未初始化的常量Chef :: Provider :: AwsS3File :: RightAws”错误

将 Provider 与 TickerProviderStateMixin 一起使用:我可以在哪里初始化我的控制器?

如何修复在Android Content provider中找不到的Content provider URL?

在 Widget 的 initState 或初始化生命周期中使用 Provider

Omniauth没有捕获初始的“ / auth /:provider”请求

jersey-client 2.22.2-如何在SslConfigurator上正确设置SunPKCS11密钥库?

Flutter Provider仅在热重装后显示结果

c ++ 11中的类成员初始化正确完成

Mockito:如何模拟javax.inject.Provider创建的原型bean?

如何从html代码隐藏/掩盖data-plyr-provider