applet com SunMSCapi não está funcionando no linux

Criamos um novo site para a nossa web, onde permitimos que os usuários assinem um documento em PDF usando um applet que criamos. A questão é que esse applet funciona bem apenas no sistema operacional Windows e gostaríamos de estendê-lo ao sistema operacional Linux.

Quando executamos o applet no linux, recebemos esta mensagem de erro:

[opensc-pkcs11] reader-pcsc.c: 896: pcsc_detect_readers: SCardListReaders falhou: 0x8010002e [opensc-pkcs11] reader-pcsc.c: 1015: pcsc_detect_readers: retornando com: Nenhum leitor encontrado [opensc-pkcs11] reader-pcsc.c : 896: pcsc_detect_readers: SCardListReaders falhou: 0x8010002e [opensc-pkcs11] reader-pcsc.c: 1015: pcsc_detect_readers: retornando com: Nenhum leitor encontrado java.security.NoSuchProviderException: nenhum provedor: SunMSCAPI at sun.security.jca. getService (fonte desconhecida) em sun.security.jca.GetInstance.getInstance (fonte desconhecida)

Acho que o problema surge quando tentamos ler os certificados armazenados no sistema operacional Windows com esta chamada em nosso código:

 KeyStore keystore = KeyStore.getInstance("Windows-MY", "SunMSCAPI"); 
            keystore.load(null, null); 
            return keystore;

Essa é a função que usamos para obter a lista de certificados.

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;


            }

Alguma idéia de como estender esse uso para linux e MAC ???

Muito obrigado por sua ajuda!!

questionAnswers(1)

yourAnswerToTheQuestion