miércoles, noviembre 01, 2006
Configurar el tomcat con certificado de cliente
Cuando queremos restringir el acceso a cierto recurso de nuestro
sistema podemos optar por el clásico esquema de proteger dicho
recurso con un par usuario/clave. Pero existe un tipo de accesos o
comunicaciones en el que dicho patrón no es adecuado. Estamos
hablando de las comunicaciones B2B (Business to Business),
es decir, de las comunicaciones entre sistemas, en contraste con las
comunicaciones B2C (Business to Client).
Pongamos un ejemplo: supongamos que tenemos un floreciente negocio
consistente en la venta de minutos de música on-line. Un
cliente puede comprar una licencia para escuchar música
on-line durante un cierto tiempo limitado. Para acceder al sistema el
usuario deberá conectarse a un determinado portal web e
identificarse tecleando su usuario y contraseña.
Ahora bien, cuando el tiempo de su licencia se agota, puede acudir
a la sección Recargas del portal y efectuar una recarga
de, por ejemplo, seis horas. Tras abonar el importe de la recarga
mediante una pasarela de pago, automáticamente su licencia se
recargará con seis horas. Pero mira por dónde, resulta
que el portal web y el sistema que gestiona las recargas de licencias
están alojados en máquinas diferentes y deben
comunicarse a través de internet. Para hacer posible esta
comunicación, el sistema de recargas proporciona un servicio
web(web service) accesible directamente usando HTTP.
Evidentemente, dicho servicio debe estar protegido, de forma que sólo
nuestro sistema pueda acceder a él.
En los dos párrafos anteriores se describen dos procesos de
comunicación distintos. El primero, el efectuado entre el
cliente y el portal web es la típica comunicación B2C,
donde la autenticación se realiza mediante un par
usuario/clave. En cambio, la segunda comunicación, entre el
portal web y el sistema de recargas es una comunicación B2B.
En dicho caso no tiene sentido que generemos un par usuario/clave,
puesto que quien se está identificando en esta ocasión
es un sistema, no una persona. En dicho escenario la solución
más adecuada es utilizar un certificado de cliente, que
identificará en este caso al portal web ante el sistema de
recargas.
Otro escenario donde quizá se vea mejor la utilidad de los
certificados cliente es el siguiente. Imaginemos que quien
efectúa las recargas es nuestra encantadora secretaria, Paula.
Paula tiene instalado en su PC un pequeño programilla que le
permite efectuar las recargas cuando un cliente llama por teléfono.
Imaginemos que en vez de utilizar un certificado cliente para
identificar el programa ante el sistema de recargas utilicemos un
esquema usuario/clave y codifiquemos directamente dichos valores en
el programilla en cuestión. ¿Qué pasaría
si dicho programilla se grabara en un CD para hacérselo llegar
a Paula y dicho CD se extraviara y llegara a manos del avispado
Maximino? Pues que Maximino podría instalar el programilla en
su casita y efectuar todas las recargas que quisiera sin pagar un
duro... En cambio, si lo que hacemos es identificar el PC que
efectúa la recarga mediante un certificado de cliente (se
instala en el propio sistema operativo, en el caso de Windows por
ejemplo) el programilla dejará de tener acceso al sistema de
recargas si se instala en otro ordenador.
Bueno, después de este rollo patatero vamos a lo que vamos,
a configurar nuestro tomcat para permitir este esquema de
autenticación. El tomcat permite configurar una autenticación
de este tipo, pero debe realizarse a nivel de "Connector"
(no se puede hacer a nivel de "Context" por
ejemplo). Lo que esto implica es que si queremos habilitar esta
autenticación para un servicio determinado debemos configurar
dicho servicio en un "Connector" independiente (con
su puerto, etc.)
Los parámetros de configuración del elemento
"Connector" que debemos establecer son:
- clientAuth: true (Tomcat will require all SSL clients to present a client Certificate in order to use this socket)
- TruststoreFile: the TrustStore file to use to validate client certificates
- truststorePass: the password to access the TrustStore
- truststoreType: JKS(formato de Java) o PKCS12(formato MSIE, Firefox)
Por supuesto, el Connector a configurar deberá estar configurado con SSL (ver http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html ) Por ejemplo, para configurar un servicio
en el puerto 8443 que requiera un certificado de cliente válido
para acceder a él debermos configurar un Connector
(TOMCAT_HOME/conf/server.xml) similar al siguiente:
<Connector port="8443"maxHttpHeaderSize="8192"
maxThreads="150"minSpareThreads="25" maxSpareThreads="75"
enableLookups="false"disableUploadTimeout="true"
acceptCount="100"scheme="https" secure="true"
clientAuth="true"sslProtocol="TLS"
truststoreFile="/home/recargas/truststore" truststorePass="bliblibli"/>
El parámetro más importante es truststoreFile,
que indica la keystore (almacén de certificados de
java) donde se encuentran los certificados (bueno, las claves
públicas de los certificados, para ser más exactos) de
los clientes que podrán acceder a este servicio. Los pasos
para generar un certificado cliente (necesitaremos tener el JDK
instalado, para poder utilizar la herramienta keytool)
son los siguientes:
Creamos el par de claves del cliente (formato PKCS12, para
poder importar después el certificado en nuestro explorador y
poder testear la configuración del tomcat):/home/andres$ keytool -v -keystore
keystore.p12 -genkey -keyalg rsa -alias RECARGAS -storetype pkcs12El keytool nos pedirá una contraseña para el
almacén de certificados que va a crear (keystore.p12).
Introduce, por ejemplo, blablabla. Después nos pedirá
una serie de datos para el certificado (no son importante, pero hay
que rellenarlos):¿Cuáles son su nombre y apellido?: Portal Web
musica.com¿Cuál es el nombre de su unidad de
organización?: Dpto. web¿Cuál es el nombre de su ciudad o localidad?:
Baiona¿Cuál es el nombre de su estado o provincia?:
Pontevedra¿Cuál es el código de país de dos
letras de la unidad?: es¿Es correcto CN=Portal Web musica.com, OU=Dpto. web,
O=musica.com, L=Baiona, ST=Pontevedra, C=es?: siGenerando bit 1.024 par de claves rsa y certificado
autofirmado (MD5WithRSA) para: CN=Portal Web musica.com, OU=Dpto.
web, O=musica.com, L=Baiona, ST=Pontevedra, C=esEscriba la contraseña clave para <RECARGAS>
Finalmente, la herramienta keytool nos preguntará una
contraseña nueva para la clave privada de este certificado.
Le damos a INTRO para que utilice la misma que la del almacén.Exportamos el certificado (nos pedirá la clave del
almacén, introducir blablabla):/home/andres$ keytool -export -file
recargas.cert -alias RECARGAS -keystore keystore.p12 -storetype
pkcs12Importamos ese certificado en la truststore del
tomcat. En este paso estaremos creando un nuevo almacén de
certificados, esta vez para el tomcat, por lo que se nos pide una
nueva clave para este nuevo almacén. Introduce bliblibli:/home/recargas$ keytool -import -keystore
/home/recargas/.truststore -file recargas.certSe nos preguntará si confiamos en el certificado después
de mostrar sus datos por pantalla. Diremos que si.
Ahora solo resta reiniciar el tomcat. Para comprobar que la
configuración es correcta podemos intentar acceder a una
página web del tomcat con nuestro explorador. Por ejemplo,
imaginemos que accedemos a https://recargas.musica.com:8443/,
donde tenemos un tomcat recién instalado y configurado con SSL
en el puerto 8443. Veríamos la siguiente página sin
mayor problema:

Ahora, si seguimos los pasos aquí descritos, reiniciamos el
tomcat y refrescamos la página veremos lo siguiente:

El explorador detecta que el servidor está solicitando un
certificado de cliente, por lo que muestra un diálogo al
usuario instándole a que seleccione el certificado a utilizar.
Muy probablemente no tengamos ningún certificado de cliente
instalado, por lo que dicho diálogo nos muestra una lista
vacía. Le damos a "Esc" para cerrar el diálogo
y efectuamos los siguientes pasos para instalar el almacén de
certificados "keystore.p12" generado anteriormente en el
almacén de certificados de Windows (nota: probablemente, al
cerrar el diálogo el Explorer nos muestre la página del
tomcat de nuevo. Esto no quiere decir que el Explorer sea un genio y
se haya saltado nuestro mecanismo de autenticación,
simplemente nos está mostrando una página guardada en
la caché):
En el Explorer seleccionamos Herramientas->Opciones de
InternetSeleccionamos la pestaña Contenido y pinchamos
en Certificados. En la pestaña actual (Personal)
pinchamos en Importar y seguimos los pasos del asistente.
Deberemos seleccionar el archivo "keystore.p12" generado
anteriormente e introducir la contraseña del mismo
("blablabla"). En el último paso dejamos marcada la
opción Seleccionar automáticamente el almacén
de certificados en base al tipo de certificado, pulsamos
Siguiente y Finalizar.Ahora debemos cerrar todas las ventanas del Explorer y volver
a arrancarlo.
Si intentamos acceder de nuevo a https://recargas.musica.com:8443/
veremos lo siguiente:

Pinchamos en Aceptar para que el Explorer utilice el
certificado mostrado para autenticarse y... ¡estamos dentro! :)
Una nota final. La clave privada asociada al certificado
regargas.cert se encuentra en el almacén "keystore.p12".
Cuando se exporta el certificado dicha clave no es exportada (lo cual
es bastante evidente, pero como todo esto es un poco lioso no está
de más señalarlo). Por tanto, para importar el
certificado de cliente en el firefox, por ejemplo, éste debe
acceder a "keystore.p12", no a recargas.cert
Hasta la próxima.
He leido el articulo de tu blog que está muy bien explicado y es muy entendible pero tengo problemas que supongo será por la configuración en mi equipo o algún detalle que se me está pasando.
En mi equipo tengo windows xp profesional y el tomcat 6.0 aunque también instale el 5.5.
He intentado configurar el tomcat con infinidad de conectores y diferentes claves pero no he logrado conseguir que pida el certificado al usuario.
Logro sin ningún problema que cifre la conexion (https y el candadito) pero no logro que salga la ventanita pidiendo el certificado de usuario.
He seguido los pasos de tu blog configurando tanto con truststoreType jks como pkcs12.
Este es uno de los conectores que he puesto
Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
truststoreFile="C:\clienteWSJava\truststorewin" truststorePass="bliblibli"/
Un conector que funciona para cifrado solo es este
Connector port="8447" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="C:\Archivos de programa\Java\jdk1.6.0\fnmtclaves" keystorePass="changeit"
clientAuth="want" sslProtocol="TLS"/
Gracias por adelantado
Has probado con tomcat 5.5? y com 5.0.28? Éste último fue el que usé para mis pruebas.
En cualquier caso, cuando arrancas el tomcat, se produce alguna excepción? (las excepciones se capturan en TOMCAT_HOME/logs/catalina.out entre otros...)
Saludos.
He instalado el Tomcat 5.0 y lo he iniciado con los mismos conectores de antes configurados. En los ficheros logs no hay ninguna excepción. Sólo un error por q no pudo instalar el monitor.
Al conector 8447 puedo conectar pero al otro conector no me deja y no me pide el certificado del cliente.
Si tienes alguna idea de por qué me sucede esto con mi tomcat no dudes en decirmela.
Un saludo y gracias
Alguien sabe como obtener los datos del certificado cliente que se ha escogido.
Saludos y Gracias anticipadas.
X509Certificate[] certs;
certs = (X509Certificate[])
request.getAttribute(
"javax.servlet.request.X509Certificate"
);
if (certs != null) {
clientCert = certs[0];
}
He creado un conector en el server.xml del tomcat y acepta los certificados del dni, pero hace que el certificado sea necesario para establecer la conexión, a pesar de que, posteriormete pueda logearse de otra forma.
Esto se resuelve con varios conectores??? Alguna idea???
Muchas gracias!
Yo quería preguntar, como hacer que para una aplicacion web en Java y con servidor Tomcat también, puedo realizar la autenticación con el DNI electronico.
Muchas gracias
mi nombre es David. Al igual que la gente anterior he seguido los pasos pero no he conseguido que el explorador solicite los certificados. En el paso que me quedo es reiniciar el tomcat, el cual me da un error diciendo que no encuentra el fichero /home/usuario/.keystore. El tomcat que utilixo es el 5.0.28
¿Es necesario crear el almacen de claves kesytore que solicita? ¿Como se debería crear? Además de estos pasos es necesario configurar algo de fichero openssl.conf
Perdona si mis términos no son los más adecuados, pero llevo con esto de los certificados digitales pocos días.
Un saludo y gracias de antemano.
antes de todos felicidades por el blog y por todos los articulos que tienes en el, los he leido con interés y están muy bien.
Mi problema es parecido al de Anonimo y si me has algún consejo, pues de p.m.
Tenemos una aplicación web basada en java corriendo en un servidor Tomcat. Y se le quiere añadir acceso por certificado digital de la FNMT. La autenticación la tiene que hacer @Firma (una plataforma de fima electrónica de la Junta de Andalucía) median un servicio web. Para realizar la autenticación en ese webService hay que pasarle el certificado del cliente como una instancia del X509Certificate de Java. Este certificado se puede capturar de una variable de sesión, que almacena el Tomcat una vez establecida el protocolo SSL. El problema es que para eso se necesitaria tener el certificado en el keystore del tomcat, y eso no es posible (empezando porque los usuarios puede ser cualquiera que posea un certificado digital de la FNMT).
¿Cómo podría pedir el certificado personal en el tomcat, sin que esté dicho certificado en el keystore del tomcat? ¿Se puede capturar el certificado de otra manera (la que sea)?
Cualquier idea que se os ocurra sería bien recibida. Muchas gracias!!
http://www.accv.es/ca-oe_c.htm
se almacenara como .cert
despues con keytool -impot lo llevarías a tu almacen de claves..
¿que pasará ahora?
cuando se intente establecer una conexión segura a la url https:/localhost:8443/url
tomcat detecta que estamos en el connector que se configuro en el server.xml ..y tambien sabe donde tiene que ir a buscar el certificado de la autoridad certificadora... esto es preguntarle al cliente si confia en la pagina.. básicamente
detecta la ac.cert por ejemplo y permite que se establezca la conexion segura.. .
despues dependiendo del servicio será necesario o no ir a buscar los certificados del cliente(los que son *.p12 )
He siguido todos los pasos, cuando accedo a la url, me sale la ventanita para elegir el certificado, lo selecciono y pulso ok.
Pero me da un error en el navegador:
"Error de certificado: Dirección no coincidente.
Este sitio web presento un certifico de seguridad emitido por una dirección de sitio web diferente...
Necesito ayuda. gracias.
Tengo un problema necesito SSL en mi servidor Tomcat 5.0, pero con el inconveniente de no poder instalar un certificado en las maquinas clientes sino utilizar uno ya hecho por una autoridad certificadora de windows. El problema que tengo es que Tomcat genera un certificado en PKCS12 y la autoridad certificadora de windows al parecer no puede firmalo alquien sabe como puedo hacer esto??
Saludos
Espero que ayude, salu2
Dont Bother With Laggin Downloads With NZB Files You Can Instantly Search High Quality Movies, PC Games, MP3 Singles, Software and Download Them at Electric Speeds
[URL=http://www.nzbsrus.com][B]Usenet[/B][/URL]
you can also into our ignite [url=http://freecasinogames2010.webs.com]casino[/url] hightail it at http://freecasinogames2010.webs.com and match in lordly means !
another late-model [url=http://www.ttittancasino.com]casino spiele[/url] neighbourhood is www.ttittancasino.com , in submit c be communicated behindhand german gamblers, revolve out sooner than frustrate abolished online casino bonus.
the finest [url=http://de.casinoapart.com]casino[/url] against UK, german and all unbelievable the world. so in instal of the choicest [url=http://es.casinoapart.com]casino en linea[/url] discontinuity us now.
Estoy intentando configurar un tomcat en windows con un puerto SSL concretamente
el 8443. Resulta que eso en Linux lo he hecho sin ningún problema. Y he intentado seguir los mismos pasos con Windows.
He puesto en el server.xml de Tomcat en Windows:
Y en los almacenes de claves he hecho (antes me he situado en C:\DAU\Certificados donde
he copiado los ficheros *.crt, *.cer que utilizaré a continuación):
$JAVA_HOME/bin/keytool -import -keystore .trustore -storepass julio00 -file ACFirmaprofesional-CA1.crt -alias AcRaizFirmaProfesional
$JAVA_HOME/bin/keytool -import -keystore .trustore -storepass julio00 -file AutoridaddeCertificacionFirmaprofesionalCIFA62634068.crt -alias AcRaizFirmaProfesionalCIFA
$JAVA_HOME/bin/keytool -import -keystore .trustore -storepass julio00 -file juridica-sw.cer -alias AcRaizJuridica
$JAVA_HOME/bin/keytool -import -keystore .trustore -storepass julio00 -file vinculada-sw.cer -alias AcRaizVinculada
Para guardar las claves raíz en el almacén de llaves. Tengo un .keystore vacío.
Y cuando arranco el Tomcat me da el siguiente error:
17-jun-2010 17:28:55 org.apache.coyote.http11.Http11BaseProtocol init
GRAVE: Error inicializando punto final (endpoint)
java.io.IOException: SSL configuration is invalid due to No available certificate or key corresponds to the SSL cipher suites which are enabled.
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.checkConfig(JSSESocketFactory.java:404)
..
El caso es que no sé que tiene de especial el windows para que no funcione cuando en Linux no
da problemas. Según la guía de Tomcat el mensaje este aparece cuando en el almacén de llaves
no se tiene ningún certificado o ninguno válido. Por lo que recomiendan ver si realmente ese almacén
dispone de claves y se está poniendo la ruta de manera correcta. La ruta es correcta porque si la modifico
me dice que no encuentra el fichero.
Y si miro los certificados del almacén:
C:\DAU\Certificados>keytool -list -keystore .trustore
Escriba la contrase±a del almacÚn de claves:
Tipo de almacÚn de claves: JKS
Proveedor de almacÚn de claves: SUN
Su almacÚn de claves contiene 4 entradas
acraizfirmaprofesionalcifa, 17-jun-2010, trustedCertEntry,
Huella digital de certificado (MD5): 73:3A:74:7A:EC:BB:A3:96:A6:C2:E4:E2:C8:9B:C
0:C3
acraizfirmaprofesional, 17-jun-2010, trustedCertEntry,
Huella digital de certificado (MD5): 92:EC:D4:84:41:33:51:E7:57:EE:A0:F3:4A:95:0
2:80
acraizvinculada, 17-jun-2010, trustedCertEntry,
Huella digital de certificado (MD5): 4A:8D:64:5D:CE:22:85:A8:1C:B3:C0:91:BB:F8:B
E:D8
acraizjuridica, 17-jun-2010, trustedCertEntry,
Huella digital de certificado (MD5): 1C:88:F4:93:6E:21:7A:26:71:40:22:77:90:A7:B
6:F2
C:\DAU\Certificados>
Os habéis encontrado con algún caso especial tratando con certificados en Windows.
Gracias anticipadas y un saludo.
Atentamente,
José-Alberto
Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="C:\DAU\Certificados\.keystore" keystorePass="julio00"
truststoreFile="C:\DAU\Certificados\.trustore" truststorePass="julio00"
Atentamente,
José-Alberto
Ya se que pasó mucho tiempo desde que está abierta esta entrada, pero esque aquí se trata un tema que necesito solucionar, asique spero que me podais ayudar.
Se trata de lo referente al primer ejemplo del post. Tengo una aplicación alojada en una máquina que accede a un servicio web alojado en otra. El cuerpo del xml de la llamada al servicio tiene que ir con una firma digital utilizando un certificado x509. Desde el codigo java de la aplicación se tratar con el certificado para firmar el xml y acceder al servicio web, pero mi duda es, como accedo a ese certificado?? donde lo configuro en el tomcat para que esté accesible desde la aplicación???
Muchas gracias y un saludo
<< Home


