FrameworkDemoiselle.gov.brCommunity Documentation

Capítulo 2. Funcionalidades relativas ao Certificado

2.1. O Certificado Digital
2.1.1. Extração de Informações utilizando anotações
2.1.2. Extração de Informações utilizando Classes
2.2. Validadores
2.2.1. CRLValidator
2.2.2. PeriodValidator
2.3. Repositório de CRL
2.3.1. Repositório Online
2.3.2. Repositório Offline
2.3.3. Configuração

O componente de segurança disponibiliza o CertificateManager que permite manipular objetos de certificado X.509 para extrair informações e validar seu conteúdo. Para trabalhar com o CertificateManager basta instanciá-lo passando o objeto X.509 no construtor. Se não for informado, serão carregados os validadores CRLValidator e PeriodValidator . A validação ocorre no momento da instanciação do objeto CertificateManager. Segue abaixo a criação do CertificateManager.



        CertificateManager cm = new CertificateManager(x509);
    

É possível desativar o carregamento dos validadores mudando a instrução para:



        CertificateManager cm = new CertificateManager(x509, false);
    

Caso seja necessário implementar os próprios validadores de certificado basta mudar a instrução para:



        
/* Neste caso os validadores padrao tambem serao carregados. */
CertificateManager cm = new CertificateManager(x509, validator1, validator2, validatorN);
    

ou



        
/* Neste caso os validadores padrao nao serao carregados. */
CertificateManager cm = new CertificateManager(x509, false, validator1, validator2, validatorN);
    

É possível também criar um CertificateManager e passar um arquivo do tipo PEM que represente um objeto X509Certificate, conforme mostrado abaixo.



        
File certFile = new File("certificado.pem");
CertificateManager cm = new CertificateManager(certFile);
    

Também é possível criar um CertificateManager que carrege um certificado direto de um token.



        
String pinNumer = "pinNumber do token";
CertificateManager cm = new CertificateManager(pinNumber);
    

Os certificados no formato X.509 podem conter várias informações armazenadas que podem ser obtidas através de um OID (Object Identifier). OID são usados extensivamente em certificados de formato X.509, como por exemplo, para designar algoritmos criptográficos empregados, políticas de certificação e campos de extensão. Cada autoridade certificadora pode definir um conjunto de OID para armazenar suas informações. O componente de segurança implementa extensões de OID para ICP-Brasil e Default.

Para extrair informações basta criar uma classe com os atributos que se deseja preencher com informações do certificado X.509. Cada atributo deve ser anotado com o seu OIDExtension. Para executar a carga das informações basta passar a classe/objeto para o CertificateManager.



                class Cert {
    @ICPBrasilExtension(type=ICPBrasilExtensionType.CPF)
    private String cpf;
    @ICPBrasilExtension(type=ICPBrasilExtensionType.NAME)
    private String nome;
    @DefaultExtension(type=DefaultExtensionType.CRL_URL)
    private List<String> crlURL;
    public String getCpf() {
        return cpf;
    }
    public String getNome() {
        return nome;
    }
    public List<String> getCrlURL() {
        return crlURL;
    }
}
            

Em seguida basta efetuar o carregamento da classe.



                CertificateManager cm = new CertificateManager(x509);
Cert cert = cm.load(Cert.class);
            

Uma outra maneira de obter os valores necessários do certificado é através das classes de apoio fornecidas pelo componente. Caso deseje obter apenas informações, básicas, podemos utilizar a classe BasicCertificate .

A seguir temos o exemplo de utilização, onde passamos um certificado para a classe e em seguida obtemos exibimos algumas informações no console.



                BasicCertificate bc = new BasicCertificate(certificate);
logger.log(Level.INFO, "Nome....................[{0}]", bc.getNome());
logger.log(Level.INFO, "E-mail..................[{0}]", bc.getEmail());
logger.log(Level.INFO, "Numero de serie.........[{0}]", bc.getSerialNumber());
logger.log(Level.INFO, "Nivel do Certificado....[{0}]", bc.getNivelCertificado());
            

Para obter informações mais específicas de um certificado de um e-CPF, e-CNPJ ou de equipamento, devemos utilizar a classe CertificateExtra .

A seguir temos alguns exemplos de de utilização.

O exemplo a seguir recupera o CPF e o número RIC de um certificado digital do tipo e-CPF.



                CertificateExtra ce = new CertificateExtra(certificate);
logger.log(Level.INFO, "CPF.....................[{0}]", ce.getOID_2_16_76_1_3_1().getCPF());
logger.log(Level.INFO, "RIC.....................[{0}]", ce.getOID_2_16_76_1_3_9().getRegistroDeIdentidadeCivil());
            

O exemplo a seguir recupera o CNPJ de um certificado digital do tipo e-CNPJ.



                CertificateExtra ce = new CertificateExtra(certificate);
logger.log(Level.INFO, "CNPJ....................[{0}]", ce.getOID_2_16_76_1_3_3().getCNPJ());
            

O exemplo a seguir recupera o nome do responsável de um certificado digital do tipo Equipamento.



                CertificateExtra ce = new CertificateExtra(certificate);
logger.log(Level.INFO, "Nome....................[{0}]", ce.getOID_2_16_76_1_3_2().getNome());
            

O Repositório de CRL disponibiliza uma lista de ICPBR_CRL (CRLs padrão ICP Brasil). Esta lista é obtida pelos arquivos de crl referentes a um certificado digital. A obtenção e armazenamentos dos arquivos de crl são implementados de dois modos: Online ou Offine.