La vérification de certificats PKCS#7 en Java

Besoin de l'aide avec le crypto routines en Java.

Donné une signature PKCS#7, je veux vérifier tous les certificats qu'il contient à l'encontre d'une banque approuvée. Je suppose que tous les certificats contenus dans la signature sont dans le bon ordre pour former un certificat valide de chemin d'accès (ou de la chaîne, peu importe), de sorte que

  • plus haut (#0) est un certificat de signature;
  • suivant (#1) est un intermédiaire certificat utilisé pour signer #0;
  • suivant (#2) est un autre intermédiaire certificat utilisé pour signer #1;
  • et ainsi de suite.

Le dernier certificat (#N) est signé par le CA.

C'est ce que j'ai réussi à pirater la mesure:

//Exception handling skipped for readability

//byte[] signature = ...
pkcs7 = new PKCS7(signature); //`sun.security.pkcs.PKCS7;`

//*** Checking some PKCS#7 parameters here

X509Certificate prevCert = null; //Previous certificate we've found
X509Certificate[] certs = pkcs7.getCertificates(); //`java.security.cert.X509Certificate`
for (int i = 0; i < certs.length; i++) {
    //*** Checking certificate validity period here

    if (cert != null) {
        //Verify previous certificate in chain against this one
        prevCert.verify(certs[i].getPublicKey());
    }
    prevCert = certs[i];
}

//String keyStorePath = ...
KeyStore keyStore = KeyStore.getInstance("JKS"); //`java.security.KeyStore`
keyStore.load(new FileInputStream(keyStorePath), null);

//Get trusted VeriSign class 1 certificate
Certificate caCert = keyStore.getCertificate("verisignclass1ca"); //`java.security.cert.Certificate`

//Verify last certificate against trusted certificate
cert.verify(caCert.getPublicKey());

Donc la question est: comment cela peut-il être fait en utilisant le standard Java des classes comme CertPath et amis? J'ai un fort sentiment que je suis re-inventer une bicyclette. Ou, si quelqu'un a un exemple avec BouncyCastle de la bibliothèque, qui serait aussi bien.

Question Bonus: comment faire pour vérifier un certificat à l'encontre d'une banque approuvée, de sorte que le certificat racine est sélectionné automatiquement?

vous savez que vous n'êtes pas censé utiliser des classes de soleil.*, droit?
Yup. Je viens de trouver cet être le moyen le plus facile pour extraire des certificats à partir du CMS de l'enveloppe. Mais je suppose que je devrais vraiment passer à BouncyCastle, même en considérant un supplément de dépendance.

OriginalL'auteur hudolejev | 2010-07-02