У меня проблема с повторным подключением к 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 "
И
Жетон был удален.