web-dev-qa-db-fra.com

Quelles données dois-je valider lors de la validation des certificats X.509 à l'aide de Java?

Eh bien, j'ai commencé avec PKI il y a un an avec un système RFID à l'école. Maintenant, on me demande de mettre en œuvre cela dans mon travail. Je comprends la plupart de l'idée. Le doute concerne la validation du certificat.

Je sais que cela a une date valide "non auparavant" et "pas après". Est-ce suffisant pour dire que le certificat est valide? En effet, les certificats sont changés chaque année et je veux être sûr que les données signées ont été signées avec une clé valide. Comment puis-je mettre en œuvre cela sur Java?

L'autre question concerne la révocation, je ne comprends pas ce qui est pour, quelqu'un peut-il m'expliquer?

6
BRabbit27

La validation des certificats est, hein, un peu plus que de regarder les dates.

Regardez - RFC 528 . Ce serait une illusion totale de croire que vous pouvez mettre en œuvre une validation de certificat avec tout type de sécurité et une interopérabilité décente, si vous ne le lisez pas à plusieurs reprises et que vous comprenez totalement ce document. Beaucoup de CRUD s'est accumulé sur les normes liées à X.509, ce qui rend la mise en œuvre de la validation de certificat une entreprise décourageante. Le Guide de style X.509 est une lecture incontournable (bien que maintenant un peu datée, elle donne toujours la bonne impression quant à l'état des choses dans le monde X.509).

Vraiment, si votre patron vous a dit de mettre en œuvre la validation de X.509, alors il vous moquait de vous, ou il est sérieusement déconnecté de la réalité.

Votre meilleur pari est d'utiliser une bibliothèque existante qui fait déjà le travail. Heureusement, Java lui-même est livré avec du code pour cela; regardez-le dans le Java.security.cert emballer. Peruse le Guide du programmeur Java PKI et le adjacent NOTE .

La révocation est l'équivalent PKI de "whoops, désolé, ignorant mon message précédent". Il est utilisé pour déclarer qu'un certificat donné ne doit pas être utilisé, même si tous les paraphers des signatures et des contraintes de noms et des arbres de politique et des principaux usages indiquent que tout va bien. La vérification du statut de révocation implique de télécharger des listes potentiellement énormes de révocation (CRL) et/ou de parler à des serveurs en ligne qui affirment l'état de certains certificats (OCSP); Quoi qu'il en soit, c'est cher, volumineux, et il ne fonctionnera que dans la mesure où l'autorité de certification correspondante publie des informations de révocation de manière appropriée et standard, c'est-à-dire que ce n'est pas si souvent.

8
Tom Leek

En plus de ce que @tom Leek's a déclaré à propos de l'API de chemin de certification, il semble que vous parlez de "Certificats TLS", que je présume que vous utilisez peut utiliser votre certificat X.509 dans la portée des TLS.

Pour ce faire dans le cadre de la pile TLS de Java (JSSE), vous pouvez utiliser l'existant X509TrustManager Infrastructure. Je dois admettre que je ne suis pas sûr de savoir si cela vérifie contre RFC 5280 ou RFC 3280 , sa spécification plus ancienne (cela dépend probablement de la version de Java Vous utilisez). Je suppose que Sun/Oracle Jre 6, mais la mise en œuvre variera en fonction des fichiers Fournisseurs de sécurité Installé. Ceci est une enveloppe en haut de l'API de chemin de certification déjà mentionnée.

Voici un exemple qui initialise un TrustManagerFactory avec null: il utilisera les valeurs Valeurs par défaut pour les ancrages de confiance . Ce qui suit vous donnera les gestionnaires de confiance:

TrustManagerFactory factory = TrustManagerFactory.getInstance("PKIX");
factory.init((KeyStore)null);
TrustManager[] trustManagers = factory.getTrustManagers();

Les check* Méthodes du gestionnaire de fiducie Jetez A CertificateException quand quelque chose a échoué. Il vérifie également la validité de la date.

Les gestionnaires de confiance peuvent être utilisés pour initialiser un SSLContext , qui peut ensuite être utilisé pour initialiser un SSLSocket (via l'usine) ou SSLEngine. Par défaut, SSLSocketFactory utilise la valeur par défaut SSLContext, elle-même initialisée avec un numéro de valeurs par défaut .

Vous pouvez également créer votre propre TrustManager si vous devez vérifier d'autres extensions pour votre application et/ou détendre certaines règles. (Par exemple, j'ai écrit une petite bibliothèque pour envelopper les gestionnaires de fiducie existants et accepter d'autres formes de certificats, tels que les certificats proxy ( RFC 3820 - pas 3280).)

Pour vérifier des extensions spécifiques, je recommanderais d'utiliser bouncycastle , car il fournit des structures de données pour traiter ASN.1 et ainsi de suite.

6
Bruno