FrameworkDemoiselle.gov.brCommunity Documentation
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);
Os OIDs default de um certificado que podem ser obtidos por essa anotação são:
BEFORE_DATE
AFTER_DATE
CERTIFICATION_AUTHORITY
CRL_URL
SERIAL_NUMBER
ISSUER_DN
SUBJECT_DN
KEY_USAGE
PATH_LENGTH
AUTHORITY_KEY_IDENTIFIER
SUBJECT_KEY_IDENTIFIER
Os OIDs definidos pela ICP-Brasil que podem ser obtidos são:
CPF
CNPJ
CEI_PESSOA_FISICA
CEI_PESSOA_JURIDICA
PIS_PASEP => Ver NIS
NOME
NOME_RESPONSAVEL_PESSOA_JURIDICA
DATA_NASCIMENTO
NUMERO_IDENTIDADE
ORGAO_EXPEDIDOR_IDENTIDADE
UF_ORGAO_EXPEDIDOR_IDENTIDADE
NUMERO_TITULO_ELEITOR
ZONA_TITULO_ELEITOR
SECAO_TITULO_ELEITOR
MUNICIPIO_TITULO_ELEITOR
UF_TITULO_ELEITOR
NOME_EMPRESARIAL
TIPO_CERTIFICADO
NIVEL_CERTIFICADO
Em computação, um identificador de objeto, do inglês object identifier (OID), é um identificador usado para nomear um objeto (comparar com URN).[1] Estruturalmente, um OID consiste de um nó em um espaço de nomes atribuído hierarquicamente, formalmente definido usando o padrão ASN.1 do ITU-T, x.690. Números sucessivos de nós, começando na raiz da árvore, identificam cada nó na árvore. Projetistas configuram novos nós registrando-os sob a autoridade de registro de nós.[2] A raiz da árvore contem os três seguintes arcos:
Em programação de computador, um identificador de objeto geralmente toma a forma de um inteiro ou ponteiro específico de implementação que identifica unicamente um objeto. Entretanto, IDOs são uma abordagem específica para criação globalmente de identificadores de objeto únicos em um sistema distribuído. Referências
Fonte: https://pt.wikipedia.org/wiki/Identificador_de_objeto
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 CRLValidator verifica se o certificado está na lista de certificados revogados da autoridade certificadora. Cada certificado pode conter uma ou mais links para os arquivos de CRL. O mecanismo de obtenção dos arquivos de crl é implementado pelos Repositórios de CRL.
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.
O Repositório Online nao utiliza um diretório para armazenamento dos arquivos crl, efetuando diretamente a consulta no endereço web da crl.
O Repositório offline utiliza um diretório onde é mantida uma lista de crl e um arquivo de índice. O arquivos de índice identificam a url do certificado e o nome do arquivos armazenado no file system, como no exemplo abaixo:
73bc162ad833c4da45ea60ac8ac016cc=https\://thor.serpro.gov.br/LCR/LCRPRA1.crl 75bc176ad833c4da05ea70ac8ac016ca=http\://ccd.serpro.gov.br/lcr/ACPRv1.crl 43bc194ad833c4da95ea90ac8ac016cb=http\://ccd2.serpro.gov.br/lcr/ACPRv2.crl
O diretório e o nome do arquivo de índice devem ser configurados através de chaves informadas em variáveis de ambiente:
signer.repository.crl.path
signer.repository.crl.index
Por padrão essas chaves são inicializadas na seguintes forma:
signer.repository.crl.path=/tmp/crls
signer.repository.crl.index=.crl_index
Programaticamente é possível modificar as propriedades por meio da classe
Configuration.
Configuration config = Configuration.getInstance();
config.setCrlIndex(".crl_index");
config.setCrlPath("/tmp/crls/");
Quando o arquivo de crl se encontra com data vencida ou não existe o arquivo no diretório, o repositório Offline realiza o download do arquivo de crl e o armazena no diretório de crl.
Para modificar o modo de uso do repositório (online ou offline) deve ser configurada a chave security.certificate.repository.online.
O valor padrão é true, mas é possível modificar programaticamente conforme abaixo.
Configuration config = Configuration.getInstance();
config.setOnline(false);