web-dev-qa-db-fra.com

Authentification CAC (Common Access Card) avec Java

Je cherche fondamentalement un endroit où commencer à apprendre à s’interfacer avec une carte CAC du gouvernement à l’aide de Java.

Mon objectif ultime est de savoir comment utiliser l'authentification par carte CAC (par PIN numéro) pour autoriser l'accès à un site Web hébergé sur un serveur Tomcat/J2EE.

Mais il me faudra un endroit pour commencer. Je suppose donc que je commencerais par écrire un petit programme Java pour lire simplement les informations de la carte CAC à partir de la carte CAC insérée dans un lecteur de carte de mon clavier (clavier Dell avec lecteur CAC au-dessus du pavé numérique).

En cherchant sur Google, j'ai trouvé le projet cacard Java ( https://cacard.dev.Java.net/ ) qui a été remplacé par le projet OpenSSO. Mais je n'arrive pas à trouver un exemple de code sur la façon de l'utiliser pour se connecter à une carte, lire à partir d'une carte, etc.

Est-ce que quelqu'un sait où je peux trouver un exemple de code afin que je puisse commencer à apprendre à interagir avec une carte CAC en utilisant Java?

Merci

MODIFIER:

Après des recherches plus approfondies, je me demandais si je pourrais simplement définir clientAuth="true" dans l'élément connecteur du fichier server.xml

http://Tomcat.Apache.org/Tomcat-6.0-doc/ssl-howto.html

clientAuth: définissez cette valeur sur true si vous souhaitez que Tomcat demande à tous les clients SSL de présenter un certificat client pour pouvoir utiliser ce socket.

27
Paul

Créez-vous l'application Web ou essayez-vous d'écrire un logiciel qui s'exécute sur le client (un peu comme votre propre navigateur Web)?

Si vous créez une application Web, il s’agit en gros d’une authentification de certification client standard. Le fait que le certificat provienne d'un jeton matériel ne change pas grand chose pour le serveur; Si vous souhaitez accepter les certificats only / CAC, vous pouvez spécifier un ensemble de stratégies de certification acceptables lorsque le serveur valide le certificat client. (La validation de stratégie fait partie intégrante de la validation PKIX.) Si cette application est destinée à un client gouvernemental, vous devrez travailler en étroite collaboration avec son équipe de sécurité pour vous assurer que votre solution répond à leurs exigences, qui peuvent être strictes. Si tel est votre scénario, faites le moi savoir et je mettrai à jour ma réponse avec certains des problèmes que nous avons rencontrés.

Si vous écrivez un client et devez accéder au lecteur physique, vous pourrez peut-être utiliser le fournisseur Sun PKCS # 11 , depuis Java 1.5. J'ai expérimenté avec ce fournisseur, et vous pouvez en savoir plus à ce sujet dans autre réponse.


Sur le serveur, vous devez vérifier que le certificat n'est pas révoqué. Cependant, certains de ces CRL sont énorme - nous avions plus de 100 Mo de fichiers CRL, et le vérificateur de révocation Sun intégré ne s'adapte pas correctement à cette taille.

Vous devrez également vous assurer que vous disposez des certificats d'autorité de certification racine appropriés dans le magasin de clés "trust" de Tomcat (les certificats de l'autorité de certification racine du gouvernement sont un peu plus difficiles à trouver car ils veulent s'assurer que les utilisateurs les vérifient correctement). Nous avons également constaté que Firefox n’envoie pas la totalité de la chaîne de certificats à moins que les utilisateurs n’importent les certificats intermédiaires dans leur navigateur manuellement.

15
erickson

Vous devez créer un fichier appelé card.config et y inclure les lignes suivantes:

name = myConfig
library = /path/to/library/that/implements/cac/card/reader 

Et puis essayez ceci:

import Java.io.*;
import Java.util.*;

import Java.security.cert.CertificateException;
import Java.security.KeyStoreException;
import Java.security.cert.X509Certificate;

import Java.security.KeyStore;
import Java.security.Provider;
import Java.security.SecureRandom;
import Java.security.Security;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class Test  
{
   public static void  main(String arg[]) throws Exception
   {
       try
       {   
         //Create our certificates from our CAC Card
         String configName = "card.config";
         Provider p = new Sun.security.pkcs11.SunPKCS11(configName);
         Security.addProvider(p);

         //Get the pin from user entered data
         Console c = System.console();
         char[] pin = c.readPassword("Enter your PIN: ");
         KeyStore cac = null;

         cac = KeyStore.getInstance("PKCS11");
         cac.load(null, pin);

         showInfoAboutCAC(cac);

      }
      catch(Exception ex)
      {
         //System.out.println("*" + ex.getMessage());
         ex.printStackTrace();
         System.exit(0);
      }
   }

   public static void showInfoAboutCAC(KeyStore ks) throws KeyStoreException, CertificateException
   {
      Enumeration<String> aliases = ks.aliases();

      while (aliases.hasMoreElements()) 
      {
         String alias = aliases.nextElement();
         X509Certificate[] cchain = (X509Certificate[]) ks.getCertificateChain(alias);

         System.out.println("Certificate Chain for : " + alias);
         for (int i = 0; i < cchain.length; i ++)
         {
            System.out.println(i + " SubjectDN: " + cchain[i].getSubjectDN());
            System.out.println(i + " IssuerDN:  " + cchain[i].getIssuerDN());
         }
      }
   }
}

À ce stade, vous disposez d'un magasin de clés que vous pouvez utiliser pour créer le socket SSL afin de pouvoir communiquer avec le serveur Web https.

9
Jay

Examinez l'utilisation de l'authentification cert à l'aide d'une application de type SSO telle que OpenSSO ou JOSSO . L'agent devrait être plus simple à intégrer et il a déjà implémenté la plupart des détails. Si vous devez le faire vous-même, ils disposent également de nombreux documents relatifs aux étapes nécessaires, tels que: configuration des certificats numériques

0
Joshua