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 HashSetreferences = 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(); } }