Как завершить работу поставщика SunPKCS11 после его инициализации?

Я инициализировал поставщика SunPKCS11:

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

И затем я использую этот провайдер для инициализации хранилища ключей, чтобы использовать ключ для операций шифрования.

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 ошибка, когда оболочка пытается связаться с токеном.

ОБНОВЛЕНИЕ С КОДОМ:

Я использую провайдера PKCS # 11 от Sun и оболочку PKCS # 11 от IAIK.

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 не может получить доступ к токену. И ЯваKeystore У API нет метода выхода из системы.

Ответы на вопрос(2)

Ваш ответ на вопрос