Análise e validação do certificado Java X509

Estou tentando processar certificados X509 em várias etapas e me deparo com alguns problemas. Eu sou novo no JCE, então não estou completamente atualizado sobre tudo ainda.

Queremos ser capazes de analisar vários certificados X509 diferentes baseados em diferentes codificações (PEM, DER e PCKS7). Eu exportei o mesmo certificado dehttps://belgium.be no formato PEM e PCKS7 usando FireFox (certificado incluindo cadeia). Eu deixei algumas linhas que não são necessárias para as perguntas

<code>public List<X509Certificate> parse(FileInputStream fis) {  
    /*
     * Generate a X509 Certificate initialized with the data read from the inputstream. 
     * NOTE: Generation fails when using BufferedInputStream on PKCS7 certificates.
     */
    List<X509Certificate> certificates = null;
      log.debug("Parsing new certificate.");
      certificates = (List<X509Certificate>) cf.generateCertificates(fis);
    return certificates;
  }
</code>

Este código está funcionando bem enquanto eu trabalho com um FileInputStream em vez de um BufferedInputStream para PCKS7, o que é bastante estranho, eu acho? Mas eu posso viver com isso.

O próximo passo é validar essas cadeias de certificados. 1) Verifique se todos os certificados têm uma data válida (fácil) 2) Valide a cadeia de certificados usando OCSP (e substitua pela CRL se não houver URL OCSP no certificado). É aqui que não sei bem como lidar com isso.

Estou usando o Sun JCE, mas parece que não há muita documentação disponível (em exemplos) para isso?

Primeiro fiz uma implementação simples que apenas verifica a cadeia sem passar pelas verificações do OCSP / CRL.

<code>private Boolean validateChain(List<X509Certificate> certificates) {
    PKIXParameters params;
    CertPath certPath;
    CertPathValidator certPathValidator;
    Boolean valid = Boolean.FALSE;

    params = new PKIXParameters(keyStore);
    params.setRevocationEnabled(false);

    certPath = cf.generateCertPath(certificates);
    certPathValidator = CertPathValidator.getInstance("PKIX");

    PKIXCertPathValidatorResult result = (PKIXCertPathValidatorResult)  
    certPathValidator.validate(certPath, params);

      if(null != result) {
        valid = Boolean.TRUE;
      }
    return valid;
 }
</code>

Isso está funcionando bem para o meu certificado PEM, mas não para o certificado PCKS7 (mesmo certifcado, exportado apenas em outro formato).java.security.cert.CertPathValidatorException: o caminho não encadeia com nenhuma das âncoras de confiança.

A única diferença que consigo ver é que a ordem em que o CertPath é formado não é a mesma? Eu não fui capaz de descobrir o que estava errado, então deixei isso por enquanto e continuei com o certificado PEM, mas vamos chamar isso de PERGUNTA 1;)

O que eu queria implementar depois foi a verificação do OCSP. Aparentemente, se eu habilitar o OCSP usando:Security.setProperty ("ocsp.enable", "true"); E definirparams.setRevocationEnabled (true); ele deve ser capaz de encontrar o URL do OCSP sozinho, mas esse não parece ser o caso. Qual é a implementação padrão que deveria fazer (PERGUNTA 2)?java.security.cert.CertPathValidatorException: deve especificar o local de um respondente OCSP

Indo além disso, encontrei uma maneira de recuperar o URL do OCSP do certificado usando o AuthorityInfoAccessExtension e tal.

Mas depois de definir o URL do OCSP manualmente na propriedade ocsp.url, estou recebendo umjava.security.cert.CertPathValidatorException: erro de resposta OCSP: UNAUTHORIZED

Parece que estou perdendo muitos passos necessários, enquanto muitas referências online dizemocsp.enable propriedade deve ser tudo que você precisa fazer?

Talvez algum de vocês, whizkids, não possa me guiar pelo processo um pouquinho? Mostre-me onde estou completamente errado :)

O próximo passo seria implementar verificações de CRL se nenhum OCSP fosse encontrado, se alguém pudesse apontar algum exemplo ou me mostrar alguma documentação sobre isso, também seria muito apreciado!

Obrigado!

EDITAR: Como ele não está pegando as propriedades sozinho, estou tentando definir todas as propriedades usando o seguinte:

<code>    // Activate OCSP
        Security.setProperty("ocsp.enable", "true");
        // Activate CRLDP -- no idea what this is
        Security.setProperty("com.sun.security.enableCRLDP", "true");

        X509Certificate target = (X509Certificate) certPath.getCertificates().get(0);
        Security.setProperty("ocsp.responderURL","http://ocsp.pki.belgium.be/");
        Security.setProperty("ocsp.responderCertIssuerName", target.getIssuerX500Principal().getName());
        Security.setProperty("ocsp.responderCertSubjectName", target.getSubjectX500Principal().getName());
        Security.setProperty("ocsp.responderCertSerialNumber", target.getSerialNumber().toString(16));
</code>

O que dá uma exceção: java.security.cert.CertPathValidatorException: Não é possível encontrar o certificado do respondente (definido usando as propriedades de segurança do OCSP).

questionAnswers(1)

yourAnswerToTheQuestion