Validation d'un certificat feuille d'un tiers dans java 8


Je cherche un moyen de valider un java.sécurité.cert.X509Certificate objet envoyé par un tiers. Le fournisseur de certificat utilise dns ou ldap pour récupérer le certificat. J'ai inclus un lien avec des informations supplémentaires sur la façon dont le certificat est récupéré.

Http://wiki.directproject.org/w/images/2/24/Certificate_Discovery_for_Direct_Project_Implementation_Guide_v4.1.pdf

J'ai également besoin de connaître les protocoles et les ports par défaut cela serait utilisé dans l'une des étapes de vérification. Le certificat doit répondre aux critères suivants de la page 13 section 4 de ce document:

Http://wiki.directproject.org/w/images/e/e6/Applicability_Statement_for_Secure_Health_Transport_v1.2.pdf

  1. n'A pas expiré.
  2. A une signature valide avec un résumé de message valide
  3. N'a pas été révoqué
  4. Liaison à l'entité attendue
  5. Possède un certificat de confiance chemin

L'élément 1 est simple pour comparer les dates des méthodes getNotAfter et getNotBefore de l'objet certificate à la date actuelle ou pour utiliser la méthode checkValidity qui lève une exception vérifiée.

Pour l'élément #2, je vois une méthode pour obtenir la signature, mais je ne sais pas comment générer le résumé de message et vérifier que la signature et le résumé de message sont tous deux valides.

Pour l'élément # 3, La liste de révocation de certification semble être mélangée avec quelques autres données en appelant cette méthode sur le certificat getExtensionValue ("2.5.29.31"). La récupération des données de la liste de révocation de certification semble possible via http, et ocsp semble être basé sur http. Je n'ai pas pu trouver comment faire cela en java.

Pour le point #4, je ne sais pas ce que signifie la liaison dans le contexte des certificats, ni ce qui est impliqué dans sa vérification.

Pour l'élément # 5, Il semble que les données des certificats intermédiaires soient mélangées à d'autres données en appelant ceci méthode sur le certificat getExtensionValue ("1.3.6.1.5.5.7.1.1"). CertPathValidator semble pouvoir aider à vérifier ces informations une fois que les données des certificats sont récupérées via http.

Author: user3624390, 2019-09-19

2 answers

La validation du certificat est une tâche complexe. Vous pouvez effectuer toutes les validations dont vous avez besoin manuellement (expiration, révocation, chaîne de certification) en utilisant support Java 8 natif ou Bouncycastle. Mais l'option que je recommande est d'utiliser une bibliothèque spécifique, qui a déjà pris en compte toutes les possibilités.

Jetez un oeil à Documentation DSS et Exemple de vérification de certificat

    // Trusted certificates sources, root and intermediates (#5 )
    CertificateSource trustedCertSource = null;
    CertificateSource adjunctCertSource = null;


    // The certificate to be validated
    CertificateToken token = DSSUtils.loadCertificate(new File("src/main/resources/keystore/ec.europa.eu.1.cer"));

    // Creates a CertificateVerifier using Online sources. It checks the revocation status with the CRL lists URLs or OCSP server extracted from the certificate #3
    CertificateVerifier cv = new CommonCertificateVerifier();
    cv.setAdjunctCertSource(adjunctCertSource);     
    cv.setTrustedCertSource(trustedCertSource);

    // Creates an instance of the CertificateValidator with the certificate
    CertificateValidator validator = CertificateValidator.fromCertificate(token);
    validator.setCertificateVerifier(cv);

    // We execute the validation (#1, #2, #3, #5)
    CertificateReports certificateReports = validator.validate();

    //The final result. You have also a detailedReport and DiagnosticData
    SimpleCertificateReport simpleReport = certificateReports.getSimpleReport();

La validation effectuera toutes les étapes que vous indiquez, y compris l'expiration, la signature du certificat, la révocation et la vérification de la chaîne de confiance (y compris le téléchargement de certificats intermédiaires).

Étape # 4 Je ne sais pas exactement ce que vous voulez dire. Je suppose que pour valider que le certificat correspond à l'une des entités de certification de la liste de confiance

Pour charger le certificat de confiance sources voir ce

CertificatePool certPool = new CertificatePool();
CommonCertificateSource ccc = new CommonCertificateSource(certPool);
CertificateToken cert = DSSUtils.loadCertificate(new File("root_ca.cer"));
CertificateToken adddedCert = ccc.addCertificate(cert);
 1
Author: pedrofb, 2019-09-24 09:48:39

Je vais diviser la réponse en 3 pièces. Le premier est l'arrière-plan , le second est le choix de la bibliothèque, du code d'implémentation (références que j'avais utilisées pour mon implémentation avec le crédit requis)

Dans le passé, j'avais implémenté un cas d'utilisation très similaire. J'ai fait faire des fabrications IOT par un fournisseur et pour les intégrer, j'ai implémenté le même processus de vérification X509 que vous avez mentionné.

Mise en œuvre : Pour ma mise en œuvre, j'avais fait référence à ce qui suit . Vous pouvez inclure BC comme votre defaultProvider (Sécurité.setProvider) et utiliser le code suivant . Le code résout directement 1,3,5. Le code est ici : https://nakov.com/blog/2009/12/01/x509-certificate-validation-in-java-build-and-verify-chain-and-verify-clr-with-bouncy-castle/

Maintenant à 2 , la réponse à cela dépend de la façon dont vous obtiendrez le certificat de votre client et quelles données supplémentaires seront fournies par l'application. Le flux de haut niveau est le suivant client produit le certificat b) Le client fait un condensé en utilisant un algorithme acceptable. SHA256 sont très populaires, vous pouvez augmenter la force en fonction des besoins et de la quantité de calcul que vous avez. Une fois que le client crée le digérer , pour prouver qu'il est le propriétaire du certificat, vous pouvez obtenir le digérer signé avec la clé privée de l'appareil. Cela peut ensuite être transmis à l'application de vérification c) Une fois que vous avez le certificat et la signature, vous pouvez alors utiliser le certificat et Public clé qui lui est associée pour vérifier la signature en appliquant le même condensé, puis en vérifiant la signature.Une bonne référence est ici: http://www.java2s.com/Code/Java/Security/SignatureSignAndVerify.htm

Je ne suis pas sûr à 100% de ce que 4 signifie. Mais si cela signifie une preuve d'identité (qui produit le certificat est tenu d'être qui ils sont , la signature et la vérification fourniront la même chose)

Bien que vous puissiez réaliser les cas d'utilisation en utilisant les API de sécurité java, j'ai utilisé bouncycastle API de base pour la réalisation des cas d'utilisation. Les API Bouncycastle sont beaucoup plus riches et testées en particulier pour les algorithmes de courbe EC étranges que nous avons dû utiliser et vous constaterez que beaucoup de gens ne jurent que par BouncyCastle.

J'espère que cela aide!

 1
Author: Ramachandran.A.G, 2019-09-21 15:40:25