Java Certificat X509 l'analyse et la validation des

Je suis en train de processus des certificats X509 en plusieurs étapes et en cours d'exécution dans un couple de problèmes. Je suis nouveau à l'entreprise criminelle commune, j'ai donc pas complètement à jour à tout moment.

Nous voulons être en mesure d'analyser plusieurs certificats X509 basé sur les différents encodages (PEM, DER et PCKS7). J'ai exporté le même certificat de https://belgium.be en PEM et PCKS7 format à l'aide de FireFox (certificat, y compris de la chaîne). J'ai laissé quelques lignes qui ne sont pas nécessaires pour les questions

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

Ce code fonctionne bien aslong que je travaille avec un FileInputStream au lieu d'un BufferedInputStream pour PCKS7, ce qui est assez étrange, déjà je pense? Mais je peux vivre avec ça.

La prochaine étape est de valider ces chaînes de certificats.
1) Vérifiez si tous les certificats ont une date valide (facile)
2) Valider le certificat de la chaîne en utilisant le protocole OCSP (et de secours de liste de révocation de certificats si aucun protocole OCSP URL se trouve dans le certificat). C'est là où je ne suis pas entièrement sûr de savoir comment gérer cela.

Je suis en utilisant le Soleil de l'entreprise criminelle commune, mais il semble que il n'y a pas beaucoup de documentation disponible (dans les exemples) pour cela?

J'ai d'abord réalisé une mise en œuvre simple que seuls les contrôles de la chaîne, sans passer par le protocole OCSP/CRL contrôles.

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

Cela fonctionne bien pour mon certificat PEM, mais pas pour le PCKS7 certificat (même certifcate, seulement exporté dans d'autres formats).
java.de sécurité.cert.CertPathValidatorException: Chemin d'accès n'a pas de chaîne avec les ancres de confiance.

La seule différence, je suis capable de voir, c'est que l'ordre dans lequel les CertPath est formée n'est pas la même chose? Je n'étais pas en mesure de comprendre ce qui n'allait pas alors j'ai laissé cela pour l'instant et continué avec le PEM certificat, mais permet d'appeler cette QUESTION 1 😉

Ce que je voulais mettre en œuvre par la suite a été OCSP vérification.
Apparemment, si j'ai activer le protocole OCSP à l'aide de: de Sécurité.setProperty("ocsp.activer", "true"); et définir params.setRevocationEnabled(true);
il devrait être en mesure de trouver la OCSP URL sur son propre, mais qui ne semble pas être le cas. Quelle est la norme de mise en œuvre censé faire (QUESTION 2)?
java.de sécurité.cert.CertPathValidatorException: Devez spécifier l'emplacement d'un Répondeur OCSP

Va au-delà de cela, j'ai trouvé un moyen de récupérer les OCSP url du certificat à l'aide de AuthorityInfoAccessExtension et.

Mais après la mise à l'OCSP url manuellement dans l'ocsp.propriété de l'url, j'obtiens un java.de sécurité.cert.CertPathValidatorException: la réponse OCSP erreur: non autorisé

Il me semble que je suis en manque beaucoup de mesures nécessaires alors que beaucoup de références en ligne-dire le réglage de la ocsp.activer la propriété devrait être tout ce que vous devez faire?

Peut-être l'un de vous whizkids cant me guider à travers le processus un peu? Montrez-moi où je suis complètement tort 🙂

La prochaine étape serait la mise en œuvre de liste de révocation de certificats vérifie si aucun protocole OCSP a été trouvé, si quelqu'un pouvait remarquer exemple ou me montrer un peu de documentation sur ce qu'il aurait également beaucoup apprécié!

Merci!

EDIT:
Puisqu'il n'est pas de ramasser les propriétés de son propre chef, j'ai essayé de définir toutes les propriétés de moi-même en utilisant les éléments suivants:

    //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));

Qui donne une exception:
java.de sécurité.cert.CertPathValidatorException: Impossible de trouver le répondeur du certificat (défini à l'aide de l'OCSP propriétés de sécurité).

OSCPChecker semble pour ce faire, dans le getOCSPServerURI méthode: grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/...
qu'est-ce que cf dans votre exemple?
Il a été un long moment, mais je dirais docs.oracle.com/javase/7/docs/api/java/security/cert/...

OriginalL'auteur Driss Amri | 2012-04-06