Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Solucionados bugs #1

Closed
wants to merge 4 commits into from
Closed

Solucionados bugs #1

wants to merge 4 commits into from

Conversation

alfongj
Copy link

@alfongj alfongj commented Jun 10, 2015

Por favor leed las descripciones de los commits. Había algún fallo grave (que causaban bloqueos de DNIs).

Muchas gracias por cierto por el pedazo curro de librería :)

Si se utilizaba el DnieKeyStore para interactuar con el DNIe, en caso de fallo al introducir mal el
pin, había activado un retry automático que fundía todos los intentos. La causa de ello es que
DnieKeyStoreImpl pasa un PasswordCallback propio que, al pedirle la contraseña, tan solo devuelve
una contraseña que tiene cacheada, en lugar de pedirla al usuario cada vez. Con otros tipos de
PasswordCallback implementados en el proyecto sí funcionaba.
…eImpl#engineGetCertificateChain() gastaba dos intentos de pin.

Ahora, al primer fallo por pin erróneo, el método lanza una excepción y no continúa.
…ba un valor erroneo

El metodo que abre un canal seguro, Dnie#verifyAndLoadCertificates(), hace tres cosas:
1) Abre un canal seguro Cwa14890
2) Verifica que el PIN sea correcto (es ademas el unico metodo que lo hace)
3) Carga los certificados de firma y autenticacion

Opino que lo idea seria refactorizar el metodo en tres, pero no me quiero meter en
berenjenales ahora...

Por otro lado, tenemos el metodo Dnie#isSecurityChannelOpen(), que comprueba solo que se
haya realizado la operacion (1) de las anteriores.

El problema era que se estaba utilizando Dnie#isSecurityChannelOpen() como precomprobacion
para operaciones que requerian que (2) y/o (3) tambien se hubieran producido.

Lo he solucionado de manera algo chapucerilla, pero que funciona. Me reitero en que si
hubiera recursos y tiempo, lo mejor seria refactorizar ese metodo en dos o tres.
Devolvia una lista con un terminal cuando no habia ninguno conectado.
@clawgrip
Copy link
Contributor

Hola Algonjg,
Muchísimas gracias, estoy echando un vistazo al parche, a ver si lo puedo aplicar antes del final de la semana. Además, me interesa mucho tenerlo listo, porque quiero ponerme ya con el soporte de DNIe 3.0. Si tengo dudas te escribo.

El cambio en Dnie#isSecurityChannelOpen() voy a intentarlo dejar un poco más bonito...

@alfongj
Copy link
Author

alfongj commented Jun 10, 2015

ME alegro de que os pueda servir de algo :)

Me suscribo al repo y en cuanto hagáis algun cambio lo re-pulleo. De momento para mis casos de uso voy tirando con mi fork mientras

@clawgrip
Copy link
Contributor

He subido los cambios vía SVN, con varias salvedades:
-El AutoRetry se quitó hace tiempo, parece que el parche aplicaba a una versión antigua.
-Para la deteccion de canal abierto y carga de certificados he preferido hacer cambios un poco más trabajados.

¿podrías por favor probar a ver qué tal todo? Quizas tarde unas horas en sincronizar el SVN con el Git.

@alfongj
Copy link
Author

alfongj commented Jun 17, 2015

Gracias! no podré probarlo hasta el fin de semana, pero a priori parece todo correcto. Cerraré el issue cuando lo pruebe si queréis, así no se me pasa :)

Edit: @clawgrip Dnie.java sigue teniendo el fallo de AUTO_RETRY en Dnie.java en el ultimo commit que hay aqui en master. ¿Sabes si es pública en algún lado la otra versión que no tiene ese problema? O si no, si hay planes de open sourcearla?

Saludos! 👍

@alfongj
Copy link
Author

alfongj commented Jun 20, 2015

Perdonad, lo voy a tener que dejar para la semana que viene.

@clawgrip
Copy link
Contributor

Ningún problema.
Mientras tanto, he añadido soporte completo a las tarjetas FNMT-RCM-CERES, gracias al patrocinio del Ayuntamiento de Zaragoza.

@pitujrg
Copy link

pitujrg commented Mar 30, 2017

Buenas tardes,

Estoy haciendo mi PFG sobre el DNIe y he encontrado muy interesante el enlace a este github, que entiendo, que es el que implementa el jar ofrecido por la administración para el uso del controlador del dnie en Java.
En la web oficial del ministerio, el enlace a la documentación está sin mantener, enlazando todos los documentos al manual de usuario. Pongo el enlace por si acaso no queda claro a lo que me estoy refiriendo: https://administracionelectronica.gob.es/ctt/controldni/descargas#.WN0fMWfYXIU

Me preguntaba, si hay un diagrama de clases, de secuencia o cualquier documento de ayuda para entender como funciona el controlador. Mi problema reside es que a la hora de intentar obtener certificados o la firma, pese a que en el manual de usuario se indica que es el propio controlador el que pide el PIN de acceso, a mi no me lo pide incluso si fuerzo a que lo haga por consola (momento en el cual me dice que no hay consola disponible).

El código es el siguiente:
final DnieProvider p = new DnieProvider();

    	Security.addProvider(p);
    	// Se obtiene el almacen y se carga
    	final KeyStore ks = KeyStore.getInstance("DNI"); //$NON-NLS-1$
    	
    	ks.load(null, null);
    	Enumeration<String> aliases = ks.aliases();
    	

    	X509Certificate cert= (X509Certificate) ks.getCertificate("CertFirmaDigital");

el error ocurre al intentar obtener el certificado de firma, y esta es la traza:

es.gob.jmulticard.card.CryptoCardException: Error en el establecimiento del canal seguro: No se pudo leer certificado de componente: java.io.IOException: Error en la seleccion del certificado de componente de la tarjeta: es.gob.jmulticard.card.iso7816four.FileNotFoundException: Fichero no encontrado: 601F
java.security.ProviderException: es.gob.jmulticard.card.CryptoCardException: Error en el establecimiento del canal seguro: No se pudo leer certificado de componente: java.io.IOException: Error en la seleccion del certificado de componente de la tarjeta: es.gob.jmulticard.card.iso7816four.FileNotFoundException: Fichero no encontrado: 601F
at es.gob.jmulticard.jse.provider.DnieKeyStoreImpl.engineGetCertificate(Unknown Source)
at java.security.KeyStore.getCertificate(Unknown Source)
at principal.main(principal.java:71)
Caused by: es.gob.jmulticard.card.CryptoCardException: Error en el establecimiento del canal seguro: No se pudo leer certificado de componente: java.io.IOException: Error en la seleccion del certificado de componente de la tarjeta: es.gob.jmulticard.card.iso7816four.FileNotFoundException: Fichero no encontrado: 601F
at es.gob.jmulticard.card.dnie.a.o(Unknown Source)
at es.gob.jmulticard.card.dnie.a.n(Unknown Source)
at es.gob.jmulticard.card.dnie.a.a(Unknown Source)
... 3 more

Todo apunta a que hay algún problema con el protocolo cwa14890 a la hora de establecer el canal seguro. No obstante, el almacen lo carga bien, y me dice que certificados hay cuando ejecuto el ks.aliases();

Muchas gracias por todo, no solo por la ayuda prestada en este caso, sino por toda la librería en sí.

Un saludo.
Javier Rubio.

@clawgrip clawgrip closed this Jan 31, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants