2009-07-24 53 views
42

Tengo un servidor Apache Tomcat 6.x ejecutándose con un certificado SSL autofirmado. Quiero que el cliente presente su propio certificado al servidor para que pueda autenticarlo en base a una base de datos de usuarios. Lo tengo todo funcionando basado en un ejemplo que encontré en línea, pero el ejemplo vino con certificados enlatados y un almacén de datos JKS preconstruido. Quiero crear mi propio almacén de datos con mis propios certs, pero no tengo suerte.Servidor Tomcat/Certificado SSL autofirmado del cliente

¿Cómo creo un datastore para Tomcat?
¿Cómo puedo crear un certificado autofirmado para Tomcat?

¿Cómo puedo crear un certificado autofirmado para el cliente?
¿Cómo obligo a Tomcat a confiar en la firma del cliente?

He estado jugando con java keytool durante muchas horas.

Respuesta

59

Finalmente encontré la solución a mi problema, así que publicaré los resultados aquí si alguien más se queda atascado.

Gracias a Michael Martin de Michael's Software Thoughts & Ramblings descubrí que:

herramienta de claves por defecto utiliza el algoritmo DSA al generar el certificado autofirmado.Las versiones anteriores de Firefox aceptaron estas claves sin problema . Con Firefox 3 beta 5, el uso de DSA no funciona, pero el uso de RSA sí lo hace. Al pasar "-keyalg RSA" al generar el certificado autofirmado crea un certificado que acepta completamente Firefox 3 beta 5 .

¡Simplemente puse esa bandera, borré todos los cachés en FireFox y funcionó como un amuleto! Estoy usando esto como una configuración de prueba para mi proyecto y necesito compartir esto con otras personas, así que escribí un pequeño script por lotes que crea dos certificados SSL. Uno se puede soltar en la configuración de Tomcat y el otro es un archivo .p12 que se puede importar a FireFox/IE. ¡Gracias!

Uso: el primer argumento de línea de comandos es el nombre de usuario del cliente. Todas las contraseñas son "contraseña" (sin cotizaciones). Cambie cualquiera de los bits codificados para satisfacer sus necesidades.

@echo off 
if "%1" == "" goto usage 

keytool -genkeypair -alias servercert -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -keystore server.jks -storepass password 
keytool -genkeypair -alias %1 -keystore %1.p12 -storetype pkcs12 -keyalg RSA -dname "CN=%1,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -storepass password 
keytool -exportcert -alias %1 -file %1.cer -keystore %1.p12 -storetype pkcs12 -storepass password 
keytool -importcert -keystore server.jks -alias %1 -file %1.cer -v -trustcacerts -noprompt -storepass password 
keytool -list -v -keystore server.jks -storepass password 
del %1.cer 
goto end 

:usage 
echo Need user id as first argument: generate_keystore [username] 
goto end 

:end 
pause 

Los resultados son dos archivos. Uno llamado server.jks que ingresas en Tomcat y otro archivo llamado {username} .p12 que importas a tu navegador. El archivo server.jks tiene el certificado del cliente agregado como certificado de confianza.

Espero que alguien más lo encuentre útil.

Y aquí es el XML que necesita ser añadido a su archivo de Tomcat conf/sever.xml (sólo probado en el Tomcat 6.x)

<Connector 
    clientAuth="true" port="8443" minSpareThreads="5" maxSpareThreads="75" 
    enableLookups="true" disableUploadTimeout="true" 
    acceptCount="100" maxThreads="200" 
    scheme="https" secure="true" SSLEnabled="true" 
    keystoreFile="${catalina.home}/conf/server.jks" 
    keystoreType="JKS" keystorePass="password" 
    truststoreFile="${catalina.home}/conf/server.jks" 
    truststoreType="JKS" truststorePass="password" 
    SSLVerifyClient="require" SSLEngine="on" SSLVerifyDepth="2" sslProtocol="TLS" 
/> 

Para Tomcat 7:

<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" 
      port="8443" SSLEnabled="true" 
      maxThreads="200" scheme="https" secure="true" 
      keystoreFile="${catalina.base}/conf/server.jks" keystorePass="password" 
      clientAuth="false" sslProtocol="TLS" />  
+1

¡Muchas gracias por esto! He estado jugando con varios "tutoriales" todo el día y este es el primero que realmente funcionó con clientAuth = "true ". –

+0

Esta es una hermosa respuesta. He ahorrado mucho tiempo con el archivo bat. Y lo mejor de todo es que funciona perfectamente. – Yster

2

Crear certificado:

keytool -genkey -alias tomcat -keyalg RSA -keystore /home/bob/mykeystore 

introducir todos los datos para el certificado autofirmado que necesita a continuación, editar server.xml de Tomcat y especificar las propiedades del almacén de claves en el conector SSL, por ejemplo:

<Connector port="8443" maxHttpHeaderSize="8192" 
     maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
     enableLookups="false" disableUploadTimeout="true" 
     acceptCount="100" scheme="https" secure="true" 
     keystoreFile="/home/bob/mykeystore" 
     clientAuth="false" sslProtocol="TLS" /> 

o seguir la documentación de Tomcat ...

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

+3

vi que antes y tengo mi la mitad de mi respuesta, pero que se está perdiendo la parte más complicada. ¿Cómo uso los cert de cliente autofirmados? En el ejemplo que proporcionó, dice "clientAuth = 'false'." Necesito que funcione cuando se establece en 'verdadero'. "Establezca este valor en verdadero si desea que Tomcat requiera a todos los clientes SSL que presenten un certificado de cliente para usar este socket." Eso es lo que quiero. No puedo hacer que el servidor acepte el certificado autofirmado del cliente. – davidemm

3

Para habilitar la autenticación del cliente, debe especificar un "almacén de confianza" para Tomcat: un almacén de claves que contiene certificados de las autoridades certificadoras raíz en las que confía, cada uno marcado como "trustEntry".

Esto se especifica por los atributos del elemento Connector: truststoreFile, truststorePass (que por defecto es el valor de keystorePass), y truststoreType (que por defecto es "JKS").

Si un cliente está utilizando un certificado autofirmado, entonces su CA "raíz" es el certificado en sí; se deduce, entonces, que debe importar el certificado autofirmado del cliente al almacén de confianza de Tomcat.

Si tiene muchos clientes, esto se convertirá rápidamente en una molestia. En ese caso, es posible que desee examinar la firma de certificados para sus clientes. El comando Java keytool no puede hacer esto, pero todas las utilidades de línea de comandos necesarias están disponibles en OpenSSL. O puede buscar algo como EJBCA a gran escala.

Mejor aún, solicite a sus clientes que utilicen una CA libre existente, como startcom.org. Esto no siempre funciona para los certificados del servidor, porque el certificado de StartCom no está incluido en todos los navegadores, pero esta situación se invierte y el certificado raíz de StartCom podría importarse fácilmente al almacén de confianza de Tomcat.

1

Las respuestas anteriores son útiles para mí, pero no tienen una versión de herramienta de shell. Así que escribí uno.

key_gen.sh:

#! /bin/bash 
# a key generator for https, 

basename=server 
key_algorithm=RSA 
password_key=123456 
password_store=123456 
country=US 

# clean - pre 
rm "${basename}.jks" 

# generate server side 
keytool -genkeypair -alias "${basename}cert" -keyalg $key_algorithm -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=${country}" -keypass $password_key -keystore "${basename}.jks" -storepass $password_store 

Para tomcat8, podría añadir siguiente configuración para server.xml:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
     maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 
     clientAuth="false" sslProtocol="TLS" 
     acceptCount="75" keystoreFile="${catalina.home}/conf/server.jks" keystorePass="123456" 
    /> 
Cuestiones relacionadas