Applet mit SunMSCapi funktioniert nicht unter Linux
Wir haben eine neue Website für unser Web erstellt, auf der die Benutzer mit einem von uns entworfenen Applet ein PDF-Dokument signieren können. Das Problem ist, dass dieses Applet nur unter Windows funktioniert und wir es gerne auf Linux OS erweitern möchten.
Wenn wir das Applet unter Linux ausführen, erhalten wir folgende Fehlermeldung:
[opensc-pkcs11] reader-pcsc.c: 896: pcsc_detect_readers: SCardListReaders failed: 0x8010002e [opensc-pkcs11] reader-pcsc.c: 1015: pcsc_detect_readers: returning with: Keine reader gefunden [opensc-pkcs11] reader-pcsc.c : 896: pcsc_detect_readers: SCardListReaders fehlgeschlagen: 0x8010002e [opensc-pkcs11] reader-pcsc.c: 1015: pcsc_detect_readers: Rückkehr mit: Keine Leser gefunden java.security.NoSuchProviderException: Kein solcher Anbieter: SunMSCAPI bei sun.security.stance getService (unbekannte Quelle) bei sun.security.jca.GetInstance.getInstance (unbekannte Quelle)
Ich denke, das Problem kommt, wenn wir versuchen, das zertifizierte in dem Windows-Betriebssystem mit diesem Aufruf in unserem Code zu lesen:
KeyStore keystore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keystore.load(null, null);
return keystore;
Diese Funktion verwenden wir, um die Liste der Zertifikate zu erhalten.
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;
}
Irgendwelche Ideen, wie man diese Verwendung auf Linux und MAC ausdehnt ???
Vielen dank für Deine Hilfe!!