Wie wird SunPKCS11 Provider nach der Initialisierung finalisiert?

Ich habe den SunPKCS11-Anbieter folgendermaßen initialisiert:

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

Und dann benutze ich diesen Provider, um einen KeyStore zu initialisieren und einen Schlüssel für Verschlüsselungsoperationen zu verwenden.

KeyStore ks = KeyStore.getInstance("PKCS11", provider);
ks.load(null, "password".toCharArray());

obald ich mit den Verschlüsselungsoperationen fertig biwie soll ich die Sitzung mit dem PKCS11-Token abschließen?

Ich habe versucht, den Provider zu entfernen, aber es hat nicht funktioniert.

Security.removeProvider("sunPCKS11ProviderName");

Das nächste Mal, wenn ich versuche, mit dem Token zu kommunizieren, wird diese Ausnahme vom Token @ ausgelös CKR_CRYPTOKI_ALREADY_INITIALIZED

AKTUALISIERE:

Ich habe versuch

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

aber es hat auch nicht geklappt.

Ich habe einen Anwendungsfall, in dem ich sowohl den PKCS # 11-Wrapper als auch den Provider verwenden muss. Um den Wrapper benutzen zu können, muss ich den Provider finalisieren, sonst wirft der TokenCKR_CRYPTOKI_ALREADY_INITIALIZED Fehler, wenn der Wrapper versucht, mit dem Token zu kommunizieren.

UPDATE WITH CODE:

Ich verwende den PKCS # 11-Provider von Sun und den PKCS # 11-Wrapper von 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);
}

a sich der Anbieter von Sun nicht abmeldet und Sitzungen nicht schließt, kann IAIK nicht auf das Token zugreifen. Und die JavaKeystore api hat keine Methode zum Abmelden.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage