Hola a todos.
Estoy intentando crear una aplicación web, con autenticación de cliente, usando el certificado de la FNMT o del DNIe.
He configurado el server.xml asi:
< Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="conf/tomcatKeyStore.jks" keystorePass="hola123"
truststoreFile="conf/trustKeystore_dnie.jks" truststorePass="gruposp2p" />
habiendo creado yo el tomcatKeyStore, como no sabia si estoy configurando bien el trustKeystore, lo he codigo del ejemplo de:
http://code.google.com/p/dniesign/wiki/AutentificacionDNIeTomcat?ts=1260...
Este store tiene dentro los certificados raiz del DNIe. Yo también lo tengo instalado en mi ordenador con los drivers del dnie.
Bueno eso por un lado :)
Por otro lado:
Tengo mapeado el web xml de la siguiente manera:
< security-constraint>
< display-name>protectedApp< /display-name>
< web-resource-collection >
< web-resource-name>secure< /web-resource-name>
< url-pattern>/secure/*< /url-pattern>
< /web-resource-collection >
< auth-constraint >
< role-name>main< /role-name>
< /auth-constraint>
< user-data-constraint >
< description>SSL required< /description>
< transport-guarantee>CONFIDENTIAL< /transport-guarantee>
< /user-data-constraint >
< /security-constraint >
< login-config >
< auth-method>CLIENT-CERT< /auth-method>
< /login-config >
El problema:
Si no utilizo el clientAuth="true" accedo mediante https sin ningún problema con el certificado de servidor que me he creado. El problema esta en que si esa opción la pongo a true (cosa necesaria si quiero autenticacion de cliente) me salta un error.
con firefox:(Código de error: ssl_error_handshake_unexpected_alert)
con explorer:Internet Explorer no puede mostrar la página web
con chrome: Error 117 (net::ERR_BAD_SSL_CLIENT_AUTH_CERT)
Yo creo que el problema esta en que estoy haciendo mal el trustKeystore por eso me da error.
A ver si entiendo la teoria.
Por un lado el certificado de servidor(el cual de momento lo creo yo, y me parece que esta bien)
Y por el otro el trustStore, Ahi que tiene haber? creo que los certificados raiz que quiero aceptar de parte del cliente, es decir en mi caso los del DNIe y FNMT.
Alguien sabe que estoy haciendo mal??
Muchas gracias por la ayuda.
Quizas mejor delegar?
tagit7 Septiembre 2010 - 7:19pm
Ciertamente este tipo de soluciones son muy engorrosas, en mucho casos es mucho más sencillo delegar en alguna plataforma de firma digital ya existente (algunas dan servicios gratuítos) que empezar algo que puede convertirse en un castillo dificilmente mantenible. En mi caso opté por delegar.
Esta claro que no se puede ni se debe hacer
abeliko23 Enero 2010 - 7:20pm
Si.
Parece que la unica opción de hacerlo es seguir con el applet, que a fin de cuentas es como realizarlo en local. Asi que nada me resignaré e intentaré hacerlo lo mas general posible para poder integralo en cualquier proyecto.
De todas maneras buscando la forma de hacerlo desde servidor, he aprendido como autenticar con certificados, que igual me viene bien mas adelante. Siempre hay que buscar la parte buena de las cosas.
Muchísimas grácias por las respuestas.
Poniendome al día en seguridad
for_a_film8 Marzo 2010 - 5:03pm
Hola,
Soy un alumno de informática haciendo el PFC que necesita orientación sobre el tema que trata este hilo. Estoy al corriente de los mecanismos de seguridad y de programar en Java pero desconozco la API de Java para firmas digitales. No necesito autenticación sino firmar digitalmente, lo mismo de lo que trata este tema.
Básicamente, tengo que crear una aplicación para firmar un formulario web (la aplicación por tanto la montaré en Tomcat). Había pensado en programar un applet ya que la firma debe hacerse en el cliente y que él firmase el formulario con uno de los certificados a elegir por el navegador. Usaré dos: el de la FNMT y el del DNIe, que por cierto nó sé cómo se instalan y se les dice a Java de su existencia (¿hay que importarlos con el keytool?).
Luego no sé muy bien cómo enviaría ese formulario al servidor donde será guardado. Había pensado en usar XML y guardarlo en una XML:DB. Otra duda es cómo configurar el web.xml de Tomcat, ¿es necesario enviar los datos cifrados al servidor con SSL?, en ese caso, ¿hay que modificar el web.xml?
Como véis estoy dando palos de ciego por todos lados y cualquier orientación o trozo de código del applet me viene bien para aprender. Cualquier manual sobre estos temas es bienvenido. Gracias!
creo que tendrías que exportar
santamaría23 Enero 2010 - 10:50am
creo que tendrías que exportar el certificado y enviar el archivo al servidor, como haciendo un upload, luego tendrías que pasarle el pin al servidor para que pudiera acceder a la clave privada. pero no sé quién se fiaría de eso, yo no me fiaría en una web pública.
Pues estoy un poco perdido
abeliko22 Enero 2010 - 12:15pm
A ver explico la situación actual :)
Tengo una aplicación web, que se según los datos que recoge de un formulario genera un informe en pdf.
Bueno la idea es que ese informe pueda ser generado con o sin firma.
En el caso de que se quiera generar firmado, se carga un applet, que accede al keystore del navegador, el usuario selecciona el cetificado que quiere usar, y con este se firma el documento. Mas o menos el camino es el siguiente:
El applet obtiene el certificado del keystore del navegador.
El applet le pide el pdf sin firmar al servidor.
Envio del pdf del server al applet.
El applet firma ese pdf con el certificado.
El applet muestra el documento firmado en el navegador.
La firma de pdfs se realiza con iText.
El problema que tiene todo esto es que es un engorro, primero porque es muy dificil de integrar en otros proyectos, al menos tener que estar todo el rato comunicandose entre servidor y applet es un lio y poco extensible.
Asi que mi idea era poder tener el certificado en el servidor de manera "legal", para que todas las firmas de documentos se hagan desde ahi y no tenga que estar pasandolos de un lado a otro.
Con la utenticación de usuarios en tomcat pensaba que podia obtener los certificados tal y como los obtenia del keystore del navegador.
Pero mi gozo en un pozo, porque solo lo obtengo en formato x.509, el cual solo tiene clave publica pero no privada.
Es decir para utenticar usuarios en el sistema genial, pero para firmar documentos con clave privada mal.
Entonces mi pregunta es: ¿Esto no se puede hacer o es que lo estoy encaminando mal?
No se si se ha cogido la idea, el plan el crear documentos firmados digitalmente pero desde el servidor.
Si alguien me puede orientar lo agradeceria.
Muchas gracias!
La firma se tiene que hacer a la fuerza en el cliente
jgzornoza22 Enero 2010 - 4:24pm
No pierdas tiempo intentando hacer lo de las firmas en el servidor, es técnicamente imposible sin la clave privada y la clave privada NUNCA se debe pasar, en el caso del DNI electrónico la clave privada no sale ni de la tarjeta.
claro, la fima se hace en el cliente
santamaría22 Enero 2010 - 11:21am
claro, la fima se hace en el cliente, en este caso en el navagador. lo suyo es generar una firma xades y enviarla al servidor que se encargará de validarla. Además si no, para querrías el applet?
yo estaba con ello
santamaría21 Enero 2010 - 10:35am
yo estaba con ello y ayer me daba el mismo problema que a ti. me bajé el raiz de la fnmt de http://www.cert.fnmt.es/index.php?cha=cit&sec=4&page=139&lang=es
lo agregué al fichero de claves (cacert) con el keytool:
keytool -import -keystore cacert -file FNMTClase2CA.cer
la única diferencia con tu config es que yo uso el mismo archivo para contener la clave rsa y el raiz. el caso es que funciona en ff.
espero que te sirva.
un saludo
Solucionado pero mas dudas
abeliko21 Enero 2010 - 7:36pm
Solucionado.
El problema es que tenia mal configurado el trustStore, una vez hecho esto ya esta todo bien.
Ahora tengo una dudilla mas. El plan es firmar electronicamente documentos, ya habia hecho un applet con el que firmo obteniendo los keystores del navegador.
El problema es que desde tomcat creo que solo puedo acceder a los certificados x509
request.getAttribute("javax.servlet.request.X509Certificate");
Ahi obtengo la clave pública, pero no tengo la clave privada. Esto quiere decir que no voy a poder firmar los documentos o es que acaso hay alguna manera de obtener la clave privada desde tomcat???
Por cierto muchas gracias por tu respuesta Santamaría
Cómo lo configuraste?
FaRz2 Febrero 2010 - 10:30am
Hola abeliko,
podrías comentar como configuraste finalmente el truststore?? Gracias