Java X509 Certificado de análisis y validación

Estoy tratando de procesar los certificados X509 en varios pasos y me encuentro con un par de problemas. Soy nuevo en JCE, así que no estoy completamente actualizado sobre todo todavía.

Queremos poder analizar varios certificados X509 diferentes basados ​​en diferentes codificaciones (PEM, DER y PCKS7). He exportado el mismo certificado desdehttps://belgium.be en formato PEM y PCKS7 usando FireFox (certificado incluyendo cadena). He dejado un par de líneas que no son necesarias para las preguntas

<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 funciona bien mientras trabajo con un FileInputStream en lugar de un BufferedInputStream para PCKS7, lo cual es bastante extraño, ya creo. Pero puedo vivir con ello.

El siguiente paso es validar estas cadenas de certificados. 1) Verifique si todos los certificados tienen una fecha válida (fácil) 2) Valide la cadena de certificados usando OCSP (y retroceda a CRL si no se encuentra una URL de OCSP en el certificado). Aquí es donde no estoy completamente seguro de cómo manejar esto.

Estoy usando Sun JCE, pero parece que no hay mucha documentación disponible (en los ejemplos) para esto.

Primero hice una implementación simple que solo comprueba la cadena sin pasar por las comprobaciones de 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>

Esto funciona bien para mi certificado PEM, pero no para el certificado PCKS7 (mismo certificado, solo se exporta en otro formato).java.security.cert.CertPathValidatorException: La ruta no encadena con ninguno de los anclajes de confianza.

La única diferencia que puedo ver es que el orden en el que se forma el CertPath no es el mismo. No pude averiguar qué fue lo que salió mal, así que dejé esto por ahora y seguí con el certificado PEM, pero llamémoslo a la PREGUNTA 1;)

Lo que quise implementar después fue la comprobación de OCSP. Aparentemente si habilito OCSP usando:Security.setProperty ("ocsp.enable", "true"); y establecerparams.setRevocationEnabled (true); debería poder encontrar la URL de OCSP por sí sola, pero no parece ser el caso. ¿Qué se supone que debe hacer la implementación estándar (PREGUNTA 2)?java.security.cert.CertPathValidatorException: debe especificar la ubicación de un Servicio de respuesta de OCSP

Más allá de esto, encontré una manera de recuperar la url de OCSP del certificado usando AuthorityInfoAccessExtension y tal.

Pero después de configurar la URL de OCSP manualmente en la propiedad ocsp.url, recibo unajava.security.cert.CertPathValidatorException: error de respuesta OCSP: NO AUTORIZADO

Parece que me faltan muchos pasos necesarios mientras que muchas referencias en línea dicen que hay que configurar elocsp.enable ¿La propiedad debería ser todo lo que necesitas hacer?

Tal vez alguno de ustedes que no pueda guiarme en el proceso un poco? Muéstrame dónde estoy completamente equivocado :)

El siguiente paso sería implementar los controles de CRL si no se encuentra un OCSP, si alguien puede señalar algún ejemplo o mostrarme alguna documentación sobre esto, ¡también sería muy apreciado!

¡Gracias!

EDITAR: Como no está recogiendo las propiedades por su cuenta, he estado intentando configurar todas las propiedades por mi cuenta usando lo siguiente:

<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>

Lo que da una excepción: java.security.cert.CertPathValidatorException: no se puede encontrar el certificado del respondedor (establecido usando las propiedades de seguridad OCSP).

Respuestas a la pregunta(1)

Su respuesta a la pregunta