апплет с SunMSCapi не работает в Linux
Мы создали новый сайт для нашей сети, где мы позволяем пользователям подписывать PDF-документ с помощью разработанного нами апплета. Проблема в том, что этот апплет работает нормально только в ОС Windows, и мы хотели бы расширить его до ОС Linux.
Когда мы запускаем апплет в Linux, мы получаем это сообщение об ошибке:
[opensc-pkcs11] reader-pcsc.c: 896: pcsc_detect_readers: сбой SCardListReaders: 0x8010002e [opensc-pkcs11] reader-pcsc.c: 1015: pcsc_detect_readers: возвращение с: читатели не найдены [opensc-pkcs11] reader-pcsc.c : 896: pcsc_detect_readers: сбой SCardListReaders: 0x8010002e [opensc-pkcs11] reader-pcsc.c: 1015: pcsc_detect_readers: возвращение с: не найдены читатели java.security.NoSuchProviderException: нет такого поставщика: SunMSCAPI в sun.security.sec. getService (Неизвестный источник) в sun.security.jca.GetInstance.getInstance (Неизвестный источник)
Я думаю, что проблема возникает, когда мы пытаемся прочитать сертифицированные данные, хранящиеся в ОС Windows, с помощью следующего вызова в нашем коде:
KeyStore keystore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keystore.load(null, null);
return keystore;
Эту функцию мы используем для получения списка сертификатов.
public KeyStore obtenerCertificados() throws Exception {
String osNombre = System.getProperty("os.name");
String osArquitectura = System.getProperty("os.arch");
String providerConfig = null;
String configuracionPKCS11 = null;
// LINUX
if(osNombre.contains(new StringBuffer("Linux")))
providerConfig = "name = OpenSC\nlibrary = /usr/lib/opensc-pkcs11.so\n";
// WINDOWS
else if(osNombre.contains(new StringBuffer("Windows")))
if(!osArquitectura.toLowerCase().contains("x86")){
System.out.println("Estamos en toLowerCase().contains x86");
providerConfig = "name = NSS"+"\n"+
"nssLibraryDirectory = "+"C:/Archivos de programa/Mozilla Firefox"+"\n"+
"nssSecmodDirectory = "+"C:/Users/SM/AppData/Local/Mozilla/Firefox/Profiles/plmk3eh9.default"+"\n"+
"nssDbMode = readOnly" + "\n" +
"nssModule = keystore" + "\n" +
"\r";
}
else{
System.out.println("Estamos en NO toLowerCase().contains x86");
providerConfig = "name = NSS"+"\n"+
"nssLibraryDirectory = "+"C:/Program Files (x86)/Mozilla Firefox"+"\n"+
"nssLibrary = "+"C:/Program Files (x86)/Mozilla Firefox/softokn3.dll"+"\n"+
"nssSecmodDirectory = "+"C:/Users/SM/AppData/Roaming/Mozilla/Firefox/Profiles/plmk3eh9.default"+"\n"+
"nssDbMode = readOnly" + "\n" +
"nssModule = keystore" + "\n" +
"\r";
}
// MAC OS
else {providerConfig = "name = OpenSC\nlibrary = /Library/OpenSC/lib/opensc-pkcs11.so\n";}
ByteArrayInputStream localByteArrayInputStream = new ByteArrayInputStream(providerConfig.getBytes());
SunPKCS11 _pk11provider = null;
try {
_pk11provider = new SunPKCS11(localByteArrayInputStream);
Security.addProvider(_pk11provider);
// _pk11provider.login(new Subject(), new DialogCallbackHandler());
}catch(Throwable e){
System.out.println(e.getMessage());
}
KeyStore keystore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keystore.load(null, null);
return keystore;
}
Любые идеи о том, как расширить это использование для Linux и MAC ???
Большое спасибо за вашу помощь!!