renovar - Servidor Tomcat/Certificado SSL autofirmado por el cliente
ssl tomcat mkyong (4)
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.
¿Cómo creo un datastore para Tomcat?
¿Cómo creo un certificado autofirmado para Tomcat?
¿Cómo creo un certificado autofirmado para el cliente?
¿Cómo obligo a Tomcat a confiar en la firma del cliente?
He estado jugando con keytool java durante muchas horas.
Crear certificado:
keytool -genkey -alias tomcat -keyalg RSA -keystore /home/bob/mykeystore
Ingrese todos los datos para el certificado autofirmado que necesita, edite Tomcat''s server.xml y especifique 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 sigue los documentos de Tomcat ...
Finalmente obtuve 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:
keytool utiliza de manera predeterminada el algoritmo DSA al generar el certificado autofirmado. Las versiones anteriores de Firefox aceptaban 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, se crea un certificado que Firefox 3 beta 5 acepta completamente.
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 la línea de comando 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 se coloca en Tomcat y otro archivo llamado {username} .p12 que usted importa a su 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í está el XML que debe agregarse a su archivo Tomcat conf / sever.xml (solo probado en 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" />
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 agregar las siguientes configuraciones a 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"
/>
Para habilitar la autenticación del cliente, debe especificar un "almacén de confianza" para Tomcat: un almacén de claves que contenga certificados de las autoridades certificadoras raíz en las que confíe, cada una señalada como "trustEntry".
Esto se especifica mediante 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 usa un certificado autofirmado, entonces su CA "raíz" es el certificado en sí mismo; 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 de Java keytool
no puede hacer esto, pero todas las utilidades de línea de comandos necesarias están disponibles en OpenSSL. O podrías ver 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.