2009-02-12 19 views
26

Ich bin grundsätzlich auf der Suche nach einem Ort zu lernen, wie man mit einer Regierung CAC-Karte mit Java zu interagieren.Common Access Card (CAC) Authentifizierung mit Java

Letztlich ist mein Ziel, um herauszufinden, wie CAC Card-Authentifizierung verwenden (durch PIN-Nummer) Zugriff auf eine Website zu autorisieren hosted einen Tomcat/J2EE-Server.

Aber ich brauche irgendwo zu starten. Also würde ich anfangen, indem ich ein kleines Java-Programm schreibe, um einfach die CAC-Karteninformation von der CAC-Karte zu lesen, die in einen Kartenleser auf meiner Tastatur eingefügt wird (DELL-Tastatur mit CAC-Leser über dem Ziffernblock).

von Google Suche, fand ich das cacard Java-Projekt (https://cacard.dev.java.net/), die vom OpenSSO Projekt ersetzt wurde. Aber ich kann nicht scheinen, Beispielcode zu finden, wie man es benutzt, um mit einer Karte zu verbinden, von einer Karte usw. zu lesen.

Weiß jemand, wo ich einigen Beispielcode finden kann, damit ich anfangen kann, wie man lernt interagieren mit einer CAC-Karte mit Java?

Dank

EDIT:

Nach der Untersuchung mehr, dachte ich, werde ich in der Lage sein, nur clientAuth="true" in dem Verbindungselement in der server.xml Datei gesetzt?

http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html

ClientAuth: dieser Wert auf true gesetzt, wenn Sie Tomcat wollen alle SSL-Clients benötigen ein Client-Zertifikat zu präsentieren, um diese Buchse zu verwenden.

+0

"Wir möchten sicherstellen, dass der Benutzer seine PIN für den Zugriff auf eine unserer browserbasierten Anwendungen rendern muss. Gibt es eine Möglichkeit, den Benutzer zu" authentifizieren ", damit er sich erneut authentifizieren muss?" Vielleicht den Socket auf der Serverseite schließen, damit die Verbindung wiederhergestellt werden muss? –

+0

Paul, ich möchte fast genau das tun, was du getan hast. Ich weiß nichts über diese Geräte und ich beginne von Anfang an. Möchten Sie den Code, den Sie für eine Lösung verwendet haben, posten? Wenn die vertraulichen Informationen redu- ziert/verdunkelt werden? Vielen Dank. Fröhlichen Freitag. Steve – Steve

Antwort

13

Erstellen Sie die Webanwendung oder versuchen Sie, Software zu schreiben, die auf dem Client ausgeführt wird (ähnlich wie Ihr eigener Webbrowser)?

Wenn Sie eine Webanwendung erstellen, handelt es sich um eine Standardauthentifizierung für die Clientzertifizierung. Die Tatsache, dass das Zertifikat von einem Hardwaretoken stammt, ändert für den Server nicht viel; Wenn Sie die CAC-Zertifikate nur akzeptieren möchten, können Sie eine Reihe akzeptabler Zertifikatsrichtlinien angeben, wenn der Server das Clientzertifikat überprüft. (Die Richtlinienvalidierung ist ein Standardteil der PKIX-Validierung.) Wenn diese Anwendung für einen Regierungskunden bestimmt ist, müssen Sie eng mit ihrem Sicherheitsteam zusammenarbeiten, um sicherzustellen, dass Ihre Lösung ihren strengen Anforderungen entspricht. Wenn dies Ihr Szenario ist, lassen Sie es mich wissen, und ich werde meine Antwort mit einigen der Probleme aktualisieren, auf die wir gestoßen sind.

Wenn Sie einen Client schreiben und auf den physischen Reader zugreifen müssen, können Sie möglicherweise die Version Sun PKCS #11 provider seit Java 1.5 verwenden. Ich habe mit diesem Anbieter experimentiert, und Sie können mehr darüber in another answer.


Auf dem Server lesen, sollten Sie überprüfen, dass das Zertifikat nicht widerrufen wird. Einige dieser CRLs sind jedoch enorm — Wir hatten über 100 MB CRL-Dateien im Wert, und die integrierte Sun-Sperrprüfung skaliert nicht gut auf diese Größe.

Sie müssen auch sicherstellen, dass Sie die richtigen Root-CA-Zertifikate in Tomcat "Trust" Keystore (die Regierung Root-CA-Zertifikate sind etwas schwieriger zu finden, weil sie sicherstellen möchten, dass Benutzer sie ordnungsgemäß überprüfen). Wir haben auch festgestellt, dass Firefox nicht die gesamte Zertifikatskette sendet, solange Benutzer die Zwischenzertifikate nicht manuell in ihren Browser importieren.

+0

Wir erstellen die Webanwendung. Also sollte ich mir keine Gedanken darüber machen müssen, die Karte überhaupt richtig zu lesen? Der Browser sollte das Zertifikat an meine Web-App weitergeben und solange der Benutzer die richtige PIN eingibt, würde Tomcat ihnen den Zugriff erlauben. Falsche PIN, Tomcat würde den Zugang verweigern, oder? –

+0

Das stimmt. Die PIN weist die Karte an, den Signaturvorgang zu aktivieren, der die Authentifizierung unterstützt. Weitere Informationen finden Sie oben in meinen Änderungen. Verwenden Sie CACs, die vom US DOD ausgestellt wurden? Ist diese Anwendung für eine Regierungsbehörde? Es gibt eine Menge zusätzlicher Regeln, denen Sie folgen müssen. – erickson

+0

+1. Ihr Webserver erhält nur ein X.509-Zertifikat in der Anfrage – Kevin

0

Überprüfen Sie die Verwendung der Cert-Authentifizierung mit einer SSO-Anwendung wie OpenSSO oder JOSSO. Der Agent sollte einfacher einzubetten sein, und die meisten Details wurden bereits implementiert. Wenn Sie es selbst zu tun, sie haben auch eine Menge an Dokumentation zu den notwendigen Schritten im Zusammenhang wie: digital certificates setup

8

Sie müssen genannt, eine Datei erstellen card.config und die folgenden Zeilen in ihm:

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

Und dann versuchen, diese:

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()); 
     } 
     } 
    } 
} 

an diesem Punkt haben Sie einen Schlüsselspeicher, dass Sie die ssl-Buchse können zu schaffen, um den hTTPS-Web-Server zu kommunizieren.