Ignore:
Timestamp:
05/03/11 15:58:45 (13 years ago)
Author:
rafaelraymundo
Message:

Ticket #1813 - Problema com mais de um driver de token configurado.

Location:
branches/2.2.0.1/security
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.0.1/security/ExpressoCert/src/br/gov/serpro/cert/DigitalCertificate.java

    r4123 r4198  
    22 
    33import br.gov.serpro.setup.Setup; 
     4import br.gov.serpro.cert.Token; 
    45import java.awt.Frame; 
    56import java.io.ByteArrayInputStream; 
     
    5859import java.io.OutputStreamWriter; 
    5960import java.security.AlgorithmParameters; 
     61import java.security.NoSuchProviderException; 
    6062import java.security.cert.CertificateEncodingException; 
    6163import java.util.regex.Matcher; 
     
    256258        // TODO: Usar dentro de um "loop" para testar outros modelos de tokens. 
    257259        this.tokens = new TokenCollection(setup); 
    258         int interfaceType = DigitalCertificate.KEYSTORE_DETECTED; 
     260 
     261        Provider[] providers = Security.getProviders(); 
     262        if (this.setup.getParameter("debug").equalsIgnoreCase("true")) { 
     263            for (Provider provider : providers) { 
     264                System.out.println(provider.getInfo()); 
     265            } 
     266        } 
     267 
     268        int interfaceType = DigitalCertificate.KEYSTORE_DETECTED; 
    259269 
    260270        try { 
     
    264274        } catch (Exception e1) { 
    265275 
    266             Provider[] providers = Security.getProviders(); 
    267276            if (this.setup.getParameter("debug").equalsIgnoreCase("true")) { 
    268                 for (Provider provider : providers) { 
    269                     System.out.println(provider.getInfo()); 
    270                 } 
    271  
    272277                // Não conseguiu abrir o token (ePass2000). 
    273278                System.out.println("Erro ao ler o token: " + e1.getMessage()); 
     
    746751     *                                                   ou Smartcard não foi encontrada, ou o usuário não inseriu o Token. 
    747752     */ 
    748     private void loadKeyStore() throws KeyStoreException { 
    749  
    750         //Provider pkcs11Provider = new sun.security.pkcs11.SunPKCS11(new ByteArrayInputStream(pkcs11Config.getBytes())); 
    751         //Security.addProvider(pkcs11Provider); 
    752         this.keyStore = KeyStore.getInstance("PKCS11"); 
    753         this.providerName = keyStore.getProvider().getName(); 
    754  
     753    private void loadKeyStore() throws GeneralSecurityException { 
     754 
     755        try{ 
     756            if (this.setup.getParameter("debug").equalsIgnoreCase("true")) { 
     757                System.out.println("Carregando provider: PKCS11"); 
     758            } 
     759            this.keyStore = KeyStore.getInstance("PKCS11"); 
     760            this.providerName = keyStore.getProvider().getName(); 
     761        } 
     762        catch (GeneralSecurityException kex){ 
     763            if (this.setup.getParameter("debug").equalsIgnoreCase("true")) { 
     764                System.out.println("Erro ao carregar provider: PKCS11"); 
     765                Throwable cause = kex.getCause(); 
     766                kex.printStackTrace(); 
     767                if (cause != null){ 
     768                    cause.printStackTrace(); 
     769                } 
     770            } 
     771            throw kex; 
     772        } 
    755773    } 
    756774 
     
    779797                this.cert = this.keyStore.getCertificate(this.selectedCertificateAlias); 
    780798             
    781                 System.out.println("Aliases (" + this.keyStore.size() + "): "); 
    782799                if (this.setup.getParameter("debug").equalsIgnoreCase("true")) { 
     800                    System.out.println("Aliases (" + this.keyStore.size() + "): "); 
    783801                    for (Enumeration alias = this.keyStore.aliases(); alias.hasMoreElements();) { 
    784802                        System.out.println(alias.nextElement()); 
     
    808826     */ 
    809827    public String getPEMCertificate() throws CertificateEncodingException { 
    810         return Base64Utils.der2pem(this.cert.getEncoded()); 
     828        if (this.cert != null){ 
     829            return Base64Utils.der2pem(this.cert.getEncoded()); 
     830        } 
     831        return null; 
     832 
    811833    } 
    812834 
  • branches/2.2.0.1/security/ExpressoCert/src/br/gov/serpro/cert/Token.java

    r1174 r4198  
    5353    } 
    5454 
    55     protected void registerToken(){ 
    56         String tokenConfiguration = new String("name = " + name + "\n" + 
    57             "library = " + libraryPath + "\ndisabledMechanisms = {\n" + 
    58             "CKM_SHA1_RSA_PKCS\n}"); 
     55    public String getProviderName(){ 
     56        return this.tokenProvider.getName(); 
     57    } 
     58 
     59    protected void registerToken(long slot){ 
     60 
     61        String tokenConfiguration = new String("name = " + name + "_" + slot + "\n" + 
     62            "library = " + libraryPath + "\nslot = " + slot + 
     63            "\ndisabledMechanisms = {\n" + "CKM_SHA1_RSA_PKCS\n}"); 
    5964 
    6065        try{ 
     
    6368                Provider pkcs11Provider = new sun.security.pkcs11.SunPKCS11(new ByteArrayInputStream(tokenConfiguration.getBytes())); 
    6469                this.tokenProvider = pkcs11Provider; 
     70                if (setup.getParameter("debug").equalsIgnoreCase("true")) { 
     71                    System.out.println("Adding provider: "+pkcs11Provider.getName()); 
     72                    System.out.println("Provider info: " + pkcs11Provider.getInfo()); 
     73                    System.out.println("Provider services:"); 
     74                    for (Provider.Service service : pkcs11Provider.getServices()){ 
     75                        System.out.println("\t"+service.toString()); 
     76                    } 
     77                } 
    6578                Security.addProvider(pkcs11Provider); 
     79                this.setName(this.tokenProvider.getName()); 
    6680                this.registered = true; 
    6781            } 
     
    7993    } 
    8094 
    81 /*    public KeyStore getKeystore() throws KeyStoreException { 
    82  
    83         return (this.keyStore = KeyStore.getInstance("PKCS11")); 
    84  
    85     } 
    86 */ 
    8795    public boolean libraryExists(){ 
    8896 
  • branches/2.2.0.1/security/ExpressoCert/src/br/gov/serpro/cert/TokenCollection.java

    r1174 r4198  
    77 
    88import br.gov.serpro.setup.Setup; 
     9import java.io.IOException; 
    910import java.util.HashMap; 
     11import java.util.logging.Level; 
     12import java.util.logging.Logger; 
     13import sun.security.pkcs11.wrapper.CK_C_INITIALIZE_ARGS; 
     14import sun.security.pkcs11.wrapper.CK_TOKEN_INFO; 
     15import sun.security.pkcs11.wrapper.PKCS11; 
     16import sun.security.pkcs11.wrapper.PKCS11Exception; 
     17import static sun.security.pkcs11.wrapper.PKCS11Constants.*; 
    1018 
    1119/** 
     
    3644         
    3745        String[] tokensArray = tokens.split(","); 
    38         for (String tokenString : tokensArray){ 
    39             if (tokenString != null && tokenString.length() > 0){ 
    40                 String[] tokenArray = tokenString.split(";"); 
     46        for (int i = 0; i < tokensArray.length; i++){ 
     47            if (tokensArray[i] != null && tokensArray[i].length() > 0){ 
     48                String[] tokenArray = tokensArray[i].split(";"); 
    4149                Token token = new Token(tokenArray[0], tokenArray[1], this.setup); 
    42                 token.registerToken(); 
    43                 if (token.isRegistered()){ 
    44                     this.put(token.getName(), token); 
     50 
     51                // Aqui testar se existe token inserido em algum slot para determinado driver. 
     52                // Pega sempre o primeiro slot registrado com a lib tokenArray[1] 
     53                // TODO: Deixar o usuário escolher o token que vai usar; 
     54                if (setup.getParameter("debug").equalsIgnoreCase("true")) { 
     55                    System.out.println("Getting slots from " + tokenArray[1]); 
     56                } 
     57                try { 
     58                    long[] slots = getSlotsWithTokens(tokenArray[1]); 
     59                    if (slots.length > 0){ 
     60                        token.registerToken(slots[0]); 
     61                        if (token.isRegistered()){ 
     62                            this.put(token.getName(), token); 
     63                        } 
     64                    } 
     65                } catch (IOException iex){ 
     66                    continue; 
    4567                } 
    4668            } 
     
    4870    } 
    4971 
     72    public long[] getSlotsWithTokens(String libraryPath) throws IOException{ 
     73        CK_C_INITIALIZE_ARGS initArgs = new CK_C_INITIALIZE_ARGS(); 
     74        String functionList = "C_GetFunctionList"; 
     75 
     76        initArgs.flags = CKF_OS_LOCKING_OK; 
     77        PKCS11 tmpPKCS11 = null; 
     78        long[] slotList = null; 
     79        try { 
     80            try { 
     81                tmpPKCS11 = PKCS11.getInstance(libraryPath, functionList, initArgs, false); 
     82            } catch (IOException ex) { 
     83                if (setup.getParameter("debug").equalsIgnoreCase("true")) { 
     84                    Logger.getLogger(TokenCollection.class.getName()).log(Level.SEVERE, null, ex); 
     85                } 
     86                throw ex; 
     87            } 
     88        } catch (PKCS11Exception e) { 
     89            try { 
     90                initArgs = null; 
     91                tmpPKCS11 = PKCS11.getInstance(libraryPath, functionList, initArgs, true); 
     92            } catch (IOException ex) { 
     93                if (setup.getParameter("debug").equalsIgnoreCase("true")) { 
     94                    Logger.getLogger(TokenCollection.class.getName()).log(Level.SEVERE, null, ex); 
     95                } 
     96            } catch (PKCS11Exception ex) { 
     97                if (setup.getParameter("debug").equalsIgnoreCase("true")) { 
     98                    Logger.getLogger(TokenCollection.class.getName()).log(Level.SEVERE, null, ex); 
     99                } 
     100            } 
     101        } 
     102 
     103        try { 
     104            slotList = tmpPKCS11.C_GetSlotList(true); 
     105 
     106            for (long slot : slotList){ 
     107                CK_TOKEN_INFO tokenInfo = tmpPKCS11.C_GetTokenInfo(slot); 
     108                if (setup.getParameter("debug").equalsIgnoreCase("true")) { 
     109                    System.out.println("slot: "+slot+"\nmanufacturerID: " 
     110                            + String.valueOf(tokenInfo.manufacturerID) + "\nmodel: " 
     111                            + String.valueOf(tokenInfo.model)); 
     112                } 
     113            } 
     114        } catch (PKCS11Exception ex) { 
     115            if (setup.getParameter("debug").equalsIgnoreCase("true")) { 
     116                Logger.getLogger(TokenCollection.class.getName()).log(Level.SEVERE, null, ex); 
     117            } 
     118        } catch (Throwable t) { 
     119            if (setup.getParameter("debug").equalsIgnoreCase("true")) { 
     120                Logger.getLogger(TokenCollection.class.getName()).log(Level.SEVERE, null, t); 
     121            } 
     122        } 
     123 
     124        return slotList; 
     125 
     126    } 
    50127} 
Note: See TracChangeset for help on using the changeset viewer.