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?
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
Vous devez vous connecter pour publier un commentaire.
Trouvé la solution moi-même. Donc, voici comment l'on peut extraire et valider un certificat de la chaîne de contre la confiance du magasin (gestion des exceptions ignorée pour des raisons de lisibilité):
validate()
va lever une exception si la validation échoue.Docs:
ASN1Set
,ContentInfo
,SignedData
. Tous les autres noms exotiques et liées docs peuvent être trouvés dansjava.security.cert
.Pas de SOLEIL ici de dépendances, seulement BouncyCastle bibliothèque fournisseur est nécessaire.
Cette question (et surtout une réponse) peut aider trop.
OriginalL'auteur hudolejev
Vous voulez CertificateFactory. Le dernier exemple de la documentation javadoc faire exactement ce que vous voulez.
SignedData
structure contenant le certificat de la liste comme l'un des champs, ce qui je dois l'extrait de la première. De toute façon,CertificateFactory.generateCertPath()
semble la voie à suivre. Merci beaucoup.OriginalL'auteur James K Polk