vehicular una taxi tarjeta requisitos publico propiedad placas perdida particular para moto identificar falsa cuesta cuanto costo como circulacion cambio java smartcard cac

java - una - tarjeta de circulacion vehicular



Autenticación de tarjeta de acceso común(CAC) con Java (3)

Observe el uso de autenticación cert usando una aplicación de tipo SSO como OpenSSO o JOSSO . El agente debe ser más simple de integrar, y ya han implementado la mayoría de los detalles. Si necesita hacerlo usted mismo, también tienen mucha documentación relacionada con los pasos necesarios, tales como: configuración de certificados digitales

Básicamente estoy buscando un lugar para comenzar a aprender cómo interactuar con una tarjeta CAC del gobierno que usa Java.

En última instancia, mi objetivo es averiguar cómo usar la autenticación de la tarjeta CAC (por número PIN) para autorizar el acceso a un sitio web alojado utilizando un servidor Tomcat / J2EE.

Pero necesitaré un lugar para comenzar. Entonces me imagino que comenzaría escribiendo un pequeño programa Java para simplemente leer la información de la tarjeta CAC de la tarjeta CAC que está insertada en un lector de tarjetas en mi teclado (teclado DELL con lector CAC sobre el teclado numérico).

Al buscar en google, encontré el proyecto cacard java ( https://cacard.dev.java.net/ ) que fue reemplazado por el proyecto OpenSSO . Pero parece que no puedo encontrar un código de muestra de cómo usarlo para conectarme a una tarjeta, leer desde una tarjeta, etc.

¿Alguien sabe dónde puedo encontrar algún código de muestra para que pueda comenzar a aprender a interactuar con una tarjeta CAC usando Java?

Gracias

EDITAR:

Después de investigar más, estaba pensando, ¿podría simplemente establecer clientAuth="true" en el elemento connector en el archivo server.xml ?

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

clientAuth: establezca este valor en verdadero si desea que Tomcat solicite a todos los clientes SSL que presenten un Certificado de cliente para usar este socket.


card.config crear un archivo llamado card.config e incluir las siguientes líneas en él:

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

Y luego prueba esto:

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

En este punto, tiene un almacén de claves que puede usar para crear el socket ssl para hablar con el servidor web https.


¿Está creando la aplicación web o intentando escribir software que se ejecute en el cliente (algo así como su propio navegador web)?

Si está creando una aplicación web, es prácticamente la autenticación estándar de certificación de cliente. El hecho de que el certificado proviene de un token de hardware no cambia mucho para el servidor; si solo desea aceptar certificados CAC, puede especificar un conjunto de políticas de certificado aceptables cuando el servidor valida el certificado del cliente. (La validación de políticas es una parte estándar de la validación de PKIX). Si esta aplicación es para un cliente del gobierno, deberá trabajar estrechamente con su equipo de seguridad para garantizar que su solución cumpla con sus requisitos, que pueden ser estrictos. Si esta es su situación, avíseme y actualizaré mi respuesta con algunos de los problemas que encontramos.

Si está escribiendo un cliente y necesita acceder al lector físico, es posible que pueda utilizar el proveedor Sun PKCS # 11 , ya que Java 1.5. He experimentado con este proveedor, y puedes leer más sobre él en otra respuesta.

En el servidor, debe verificar que el certificado no esté revocado. Sin embargo, algunas de estas CRL son enormes. Contamos con más de 100 Mb de archivos CRL, y el comprobador de revocación de Sun incorporado no se adapta bien a este tamaño.

También deberá asegurarse de tener los certificados de CA raíz correctos en el almacén de claves de "confianza" de Tomcat (los certificados de CA raíz del gobierno son un poco más difíciles de encontrar porque quieren asegurarse de que los usuarios los verifiquen correctamente). También descubrimos que Firefox no envía toda la cadena de certificados a menos que los usuarios importen manualmente los certificados intermedios en su navegador.