Как исправить ошибку «Переподключить SunPKCS11 после того, как тайм-аут соединения с токеном был удален» - PullRequest
1 голос
/ 31 мая 2019

У меня проблема с повторным подключением к SUNPKCS11 после истечения времени ожидания подключения, и я хочу повторно подключиться к SUNPKCS11.

Я использую этот код для подключения к SUNPKCS11 в первый раз.

public void getConnection(String name, String slot, String lib, String type, String password) throws Exception {
    if (type.contains("PKCS11")) {
        StringBuilder cfg = new StringBuilder();
        cfg.append("name=" + name);
        cfg.append(System.getProperty("line.separator"));
        cfg.append("slot=" + slot);
        cfg.append(System.getProperty("line.separator"));
        cfg.append("library=" + lib);
        cfg.append(System.getProperty("line.separator"));
        cfg.append("disabledMechanisms = {");
        cfg.append(System.getProperty("line.separator"));
        cfg.append("CKM_SHA1_RSA_PKCS");
        cfg.append(System.getProperty("line.separator"));
        cfg.append("}");
        InputStream isCfg = new ByteArrayInputStream(cfg.toString().getBytes());
        //Provider p = new SunPKCS11(isCfg);
        p = new SunPKCS11(isCfg);
        p.setProperty("pkcs11LibraryPath", lib);
        Security.addProvider(p);
        keyStore = KeyStore.getInstance(type, p);
        keyStore.load(null, password.toCharArray());


        providerName = p.getName();
        authProvider = (AuthProvider) keyStore.getProvider();
        //String alias = keyStore.aliases().nextElement();
        alias = keyStore.aliases().nextElement();
        privateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());
        certificateChain = keyStore.getCertificateChain(alias);
        certificate = keyStore.getCertificate(alias);
        keyStorePrivateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias,
                new KeyStore.PasswordProtection(password.toCharArray()));
        x509Certificate = (X509Certificate) keyStorePrivateKeyEntry.getCertificate();
    } else {
        throw new Exception("PK Type Not support");
    }
}

И время ожидания составляет 1 час. Поэтому я создаю метод Reconnect для использования Reconnect для SUNPCKS11

public void reconnect() throws Exception {
    try {


        final String name = etaxProperties.getCs11_provider_name();
        final String library = etaxProperties.getCs11_lib_path();
        final String slot = etaxProperties.getCs11_slot_id();

        // 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, etaxProperties.getCs11_password().toCharArray());

        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);
        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();
        slots[0].getToken();

        pkcs11Module.finalize(null);

        }catch(Exception e){
            log.error(e.getMessage());
        }
    }

Но есть сообщение об ошибке:

java.security.InvalidKeyException: закрытые ключи должны быть экземпляром ключа RSAPrivate (Crt) или иметь кодировку PKCS # 8 "

И

Жетон был удален.

...