Validação dos certificados digitais

 

A validação dos certificados digitais é efetuada apenas em conformidade com a RFC 5280. De um modo geral, o design da aplicação prevê a implementação dos requisitos da ICP-Brasil como um módulo próprio. Isso vale igualmente para a Arquitetura do dispositivo de políticas de assinatura. Aqui o conjunto ValidationInputs deve receber tanto um CertificatesChain, que encapsula a cadeia de certificados, quanto um CertificateUsage. Essas diferentes entradas são refletidas em implementações diferentes de Rule, opção adotada tão somente por comodidade, de modo a desonerar a implementação final da regra da necessidade de obter a entrada apropriada. O dispositivo prevê duas validações distintas, uma aplicável a certificados de entidades finais (CertificateProcessor) e uma aplicável a certificados de TSA (Time-Stamp Authorities), implementada na classe TSACertificateProcessor. Cada regra aplicável está descrita a seguir.

Classe Regra Saída Recuperável Aplicabilidade
VerifyChain Verifica se o caminho de certificação está completo, determinando se todos os emissores estão presentes. Erro Sim CertificateProcessor
TSACertificateProcessor
VerifyIssuerSignature Verifica se o caminho de certificação está válido, validando a assinatura de cada certificado. Erro Não CertificateProcessor
TSACertificateProcessor
VerifyKeyUsage Verifica a consistência da extensão Key Usage. Erro Não CertificateProcessor
VerifyCDP Verifica se a extensão CRL DistributionPoints está presente e contém uma URL. Erro Não CertificateProcessor
TSACertificateProcessor
VerifyValidity Verifica se o certificado apresentado estava dentro do prazo de validade quando usado. Erro Fatal Não CertificateProcessor
TSACertificateProcessor
VerifyExtendedKeyUsage Verifica a consistência da extensão Extended Key Usage. Erro Não TSACertificateProcessor

 

Um exemplo de uso do dispositivo de validação pode ser visto a seguir:

public class TestCertificateValidation {

	public static void main(String[] args) {
		
		// Gets the data to be validated
		X509Certificate cert = getCertificate("VIC.cer");
		X509Certificate[] chain = getCertificateChain();
		Date usage = Calendar.getInstance(Locale.getDefault()).getTime();
		
		// Registers the validation rules implementation
		TestCertificateValidation validator = new TestCertificateValidation();
		String implementationName = validator.registerComponents();
		
		// Runs the validation rules and do somente with result
		ValidationOutputs output = validator.validateChan(cert, chain, usage, implementationName);
		System.out.println(output.toString());
	}
	
	
	public String registerComponents() {
		String name = "GENERAL-CERTIFICATE";
		
		// Register the validation rules set (in this case, only one member)
		ValidationRules rules = new ValidationRules();
		rules.add(new VerifyChain());
		rules.add(new VerifyIssuerSignature());
		rules.add(new VerifyKeyUsage());
		rules.add(new VerifyCDP());
		rules.add(new VerifyValidity());
		ValidationRules.register(name, rules);
		
		// Signals to implementation the validation rules set name
		HashSet references = new HashSet();
		references.add(name);
		CertificateProcessor.register(references);
		
		// Registers the processor
		RulesProcessor.register(name, new CertificateProcessor());
		return name;
	}
	
	public ValidationOutputs validateChan(X509Certificate cert, X509Certificate[] chain, Date usage, String implementationName) {

		// Gets the inputs to rules
		ValidationInputs inputs = new ValidationInputs();
		inputs.add(new CertificatesChain(chain));
		inputs.add(new CertificateUsage(cert, usage));

		// Gets the processor
		RulesProcessor implementation = RulesProcessor.getInstance(implementationName);
		implementation.setValidationInputs(inputs);
		
		// Runs the validation rules
		return implementation.execute();
	}

}