Ahora que han pasado unos meses desde el lanzamiento de Java 6 y que en casi en cualquier provincia puedes expedir un dni electrónico ya podemos empezar a pensar como hacer uso de ambos.
Dentro de nuestro dnie se encuentran varios certificados digitales para firma electrónica o autenticación, para acceder a ellos necesitamos es un lector de tarjetas que acepte nuestro documento.
Una de las nuevas incorporaciones en java 6, y de las menos publicitadas, es el soporte nativo para acceder al almacen de claves de windows. Hasta ahora teníamos que usar complejas DLLs de windows para acceder a este almacen, pero con esta nueva release es tan fácil como esto:
KeyStore keyStore = KeyStore.getInstance("Windows-MY"); keyStore.load(null, null);
Como no todos en este mundo usamos ese sistema operativo, dentro de nuestro dnie también podremos encontrar los certificados dentro de una librería PKCS#11 llamada opensc-pkcs11.so que podremos usar en cualquier otro sistema. El proceso de acceder a una librería PKCS#11 es un poco más tedioso pero hay muy buenos artículos en la red que lo explican . Una aproximación rápida podría ser que tenemos que añadir esta librería como un proveedor de certificados a nuestro almacen de claves PKCS#11 y luego acceder a este para recuperar los certificados. Para añadir la librería a nuestro almacén necesitaríamos algo como esto:
String pkcs11config = "name = DNIE\nlibrary = opensc-pkcs11.so "; InputStream confStream = new ByteArrayInputStream(pkcs11config.getBytes()); Class sunPkcs11Class = Class.forName("sun.security.pkcs11.SunPKCS11"); Constructor pkcs11Constr = sunPkcs11Class.getConstructor(InputStream.class); Provider pkcs11Provider = (Provider) pkcs11Constr.newInstance( confStream ); Security.addProvider(pkcs11Provider);
para acceder a este almacén:
KeyStore keyStore = KeyStore.getInstance("PKCS11"); keyStore.load(null, password);
Una vez cargado nuestro almacén de claves correspondiente podríamos acceder a todos los certificados que contiene a través de sus alias:
Enumeration enumeration = keyStore.aliases(); while (enumeration.hasMoreElements()) { String alias = enumeration.nextElement().toString(); Certificate[] certs = store.getCertificateChain( alias ); }
Y con esto ya tendríamos acceso a los certificados de nuestro dni electrónico y podríamos ir pensando en como darles uso.
Actualización: Si nuestros usuarios usan Mac OS X y queremos acceder al almacén de claves de este sistema tendríamos que usar el siguiente código:
KeyStore keyStore = KeyStore.getInstance("KeychainStore", "Apple"); keyStore.load(null, null);
