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