Quiero saber si hay una manera de configurar Tomcat server.xml
para usar el cifrado SSL con una clave privada almacenada de forma remota en un servidor. Me imagino que la configuración del servidor sería algo como esto.
Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
proxyPort=""
keystoreFile="{./script-return}/keystore.jks"
keystorePass="12345"
keystoreType="jks"
truststorePass="12345"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
Pero la keystoreFile
directiva apunta a un script que extrae la clave privada del servidor remoto.
¿Hay alguna manera en la configuración de Tomcat de hacer que apunte a un script de shell para extraer la clave?
encontré algo sobreAdministrador de confianzapero veo que la ruta tiene que apuntar a una ruta del sistema de archivos, lo cual no es una alternativa para mí.
Respuesta1
"Extraer la clave" anula por completo el objetivo de usar un HSM: significa que la clave privada aún estaría almacenada en la memoria de Tomcat (por lo que habría sido posible robar usando, por ejemplo, Heartbleed), y cualquiera que mirara server.xml
aún podría robarla. porsimplemente ejecutando exactamente el mismo comandocomo lo hace Tomcat.
Tu idea sólo tiene sentido si puedes hacer Tomcatenviar solicitudes de firmaal HSM. Esto aumentará un poco la latencia (debido a que cada conexión TLS tiene que llegar al HSM), pero es el único enfoque que realmente agrega algo de seguridad.
(Ni siquiera es necesario que sea un HSM real; incluso podría ser SoftHSM2 ejecutándose en el mismo sistema, y seguiría siendo más seguro siempre que mantenga firmemente la clave en una cuenta de usuario y Tomcat en la otra).
Usando un módulo PKCS#11 en el mismo sistema
Puede avanzar rápidamente por esta sección, pero los pasos básicos para usar PKCS#11 con Tomcat son:
- Crea un archivo con:
/etc/java-<name>.cfg
nombre =<nombre_hsm>
(Ajuste la ruta de la biblioteca según su distribución. La documentación completa de este archivo de configuración se puede encontrar en elGuía de Java PKCS#11.)
biblioteca = /usr/lib/p11-kit-proxy.so - Agregue una nueva línea a su
java.security
archivo:proveedor.de.seguridad.NÚMERO=sun.security.pkcs11.SunPKCS11 /etc/java-<nombre>.cfg
- Ejecute keytool y asegúrese de que muestre el contenido de su HSM:
herramienta clave --list --storetype PKCS11
Finalmente, configure Tomcat para usar PKCS#11:
<Connector ... keystore="NONE" keystoreType="PKCS11" keystoreProvider="SunPKCS11-hsm_name" keystorePass="[HSM PIN here]" />
Usando un módulo PKCS#11 desde un servidor remoto
Elkit-p11El paquete viene con dos componentes que pueden lograr esto:
El
p11-kit-proxy.so
módulo PKCS#11, que actúa como multiplexor y se puede configurar para cargar varios otros módulos según la configuración. Entre otras cosas, puede comunicarse con un módulo fuera de proceso a través de una tubería.La
p11-kit remote
herramienta, que actúa como el otro extremo del tubo para el soporte del módulo fuera de proceso del p11-kit. Se puede utilizar a través de SSH o cualquier otro túnel.
Primero en el lado de HSM:
- Instale p11-kit y elija o cree una cuenta de usuario que lo utilizará.
- Cree un archivo en esa cuenta de usuario para informarle a p11-kit sobre su módulo HSM PKCS#11. El contenido del archivo consta de una línea:
~/.config/pkcs11/modules/<name>.module
módulo: /usr/lib/<hsm_pkcs11_nombre>.entonces
(Como alternativa, puede crearlo en el directorio de todo el sistema/usr/share/p11-kit/modules/
). - Asegúrese
p11-kit list
yp11tool --list-tokens
trabaje con el HSM.
Nota: Los pasos 2 y 3 en realidad no son necesarios para este plan; sólo están ahí para que se puedan detectar posibles problemas a tiempo. Si resulta que p11-kit es incompatible con el módulo HSM, le ahorrará algo de trabajo. (Y si es compatible, podrá usarlo p11tool
para administrarlo).
Luego en el lado de Tomcat:
- Instale también el kit p11.
- Cree un par de claves SSH para Tomcat y colóquelo en la cuenta HSM
authorized_keys
para uso SSH sin contraseña. - Vuelva a crear un archivo en el directorio de inicio de la cuenta de usuario de Tomcat, pero esta vez el contenido del archivo debería verse así:
~/.config/pkcs11/modules/<name>.module
remoto: |ssh usuario@hsmserver p11-kit remoto /usr/lib/<hsm_pkcs11_nombre>.entonces
- De nuevo, asegúrate
p11-kit list
yp11tool --list-tokens
trabaja. Simplemente deberían establecer mágicamente una conexión SSH y mostrar información sobre el HSM remoto. - Para acelerar el acceso remoto, habilite la multiplexación de conexiones en SSH a través de
~/.ssh/config
:Anfitriónservidor hsm
ControlPath ~/.ssh/S.%r@%h:%p
ControlMaster auto
ControlPersist 1h
Si todo funciona, intente usarlo keytool
con el módulo p11-kit-proxy PKCS#11:
- Crea un
/etc/java-p11-kit.cfg
archivo con:nombre = biblioteca p11-kit
(Ajuste la ruta de la biblioteca según su distribución. La documentación completa de este archivo de configuración se puede encontrar en elGuía de Java PKCS#11.)
= /usr/lib/p11-kit-proxy.so - Agregue una nueva línea a su
java.security
archivo:proveedor.de.seguridad.NÚMERO=sun.security.pkcs11.SunPKCS11 /etc/java-p11-kit.cfg
- Ejecute keytool y asegúrese de que muestre el contenido de su HSM:
herramienta clave --list --storetype PKCS11
Finalmente, configure Tomcat para usar el módulo p11-kit-proxy PKCS#11:
<Connector ... keystore="NONE" keystoreType="PKCS11" keystoreProvider="SunPKCS11-p11-kit" keystorePass="[HSM PIN here]" />