Trust Store vs Key Store: creación con keytool
Entiendo que el almacén de claves normalmente contendrá claves privadas/públicas y el almacén de confianza solo claves públicas (y representa la lista de partes confiables con las que desea comunicarse). Bueno, esa es mi primera suposición, así que si no es correcta, probablemente no he empezado muy bien...
Sin embargo, estaba interesado en comprender cómo y cuándo se distinguen las tiendas cuando se utiliza keytool.
Hasta ahora he creado un almacén de claves usando
keytool -import -alias bob -file bob.crt -keystore keystore.ks
que crea mi archivo keystore.ks. Respondo yes
a la pregunta: ¿confío en Bob pero no me queda claro si esto ha creado un archivo de almacén de claves o un archivo de almacén de confianza? Puedo configurar mi aplicación para usar el archivo como cualquiera.
-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x
y con System.setProperty( "javax.net.debug", "ssl")
set, puedo ver el certificado en certificaciones confiables (pero no en la sección del almacén de claves). El certificado particular que estoy importando tiene solo una clave pública y tengo la intención de usarlo para enviar cosas a través de una conexión SSL a Bob (¡pero tal vez sea mejor dejar eso para otra pregunta!).
Cualquier sugerencia o aclaración sería muy apreciada. ¿La salida de keytool es la misma, independientemente de lo que importe y es simplemente una convención que dice que uno es un almacén de claves y el otro un almacén de confianza? ¿Cuál es la relación cuando se usa SSL, etc.?
La terminología es un poco confusa, pero ambos javax.net.ssl.keyStore
y javax.net.ssl.trustStore
se usan para especificar qué almacenes de claves usar, para dos propósitos diferentes. Los almacenes de claves vienen en varios formatos y ni siquiera son necesariamente archivos (consulte esta pregunta ), y keytool
son solo una herramienta para realizar varias operaciones en ellos (importar/exportar/listar/...).
Los parámetros javax.net.ssl.keyStore
y javax.net.ssl.trustStore
son los parámetros predeterminados que se usan para construir KeyManager
s y TrustManager
s (respectivamente), luego se usan para construir un SSLContext
que esencialmente contiene la configuración SSL/TLS que se usará al realizar una conexión SSL/TLS a través de un SSLSocketFactory
o un SSLEngine
. Estas propiedades del sistema son de donde provienen los valores predeterminados, que luego son utilizados por SSLContext.getDefault()
, a su vez utilizados por, SSLSocketFactory.getDefault()
por ejemplo. (Todo esto se puede personalizar a través de la API en varios lugares, si no desea utilizar los valores predeterminados y los SSLContext
mensajes de correo electrónico específicos para un propósito determinado).
La diferencia entre KeyManager
y TrustManager
(y por lo tanto entre javax.net.ssl.keyStore
y javax.net.ssl.trustStore
) es la siguiente (citado de la guía de referencia JSSE ):
TrustManager: determina si se debe confiar en las credenciales de autenticación remota (y, por tanto, en la conexión).
KeyManager: determina qué credenciales de autenticación enviar al host remoto.
(Hay otros parámetros disponibles y sus valores predeterminados se describen en la guía de referencia de JSSE . Tenga en cuenta que, si bien existe un valor predeterminado para el almacén de confianza, no hay uno para el almacén de claves).
Esencialmente, el almacén de claves javax.net.ssl.keyStore
está destinado a contener sus claves privadas y certificados, mientras que el almacén de claves javax.net.ssl.trustStore
está destinado a contener los certificados de CA en los que está dispuesto a confiar cuando una parte remota presenta su certificado. En algunos casos, pueden ser la misma tienda, aunque suele ser una mejor práctica utilizar tiendas distintas (especialmente cuando están basadas en archivos).
Para explicar en un caso de uso/propósito común o de manera sencilla:
TrustStore : se utiliza para almacenar los certificados de entidades confiables. Un proceso puede mantener un almacén de certificados de todas las partes de confianza en las que confía.
keyStore : Se utiliza para almacenar las claves del servidor (tanto públicas como privadas) junto con el certificado firmado.
Durante el protocolo de enlace SSL,
Un cliente intenta acceder a https://
Y así, el servidor responde proporcionando un certificado SSL (que se almacena en su almacén de claves)
Ahora, el cliente recibe el certificado SSL y lo verifica a través de TrustStore (es decir, el TrustStore del cliente ya tiene un conjunto predefinido de certificados en los que confía). Es como: ¿Puedo confiar en este servidor? ¿Es este el mismo servidor con el que estoy intentando hablar? ¿No hay ataques de intermediarios?
Una vez que el cliente verifica que está hablando con un servidor en el que confía, la comunicación SSL puede realizarse a través de una clave secreta compartida.
Nota: No estoy hablando aquí de nada sobre la autenticación del cliente en el lado del servidor. Si un servidor también desea realizar una autenticación de cliente, entonces el servidor también mantiene un almacén de confianza para verificar el cliente. Entonces se convierte en TLS mutuo.
Un servidor utiliza Keystore para almacenar claves privadas, y un cliente externo utiliza Truststore para almacenar claves públicas proporcionadas por el servidor para acceder. Lo he hecho en mi aplicación de producción. A continuación se detallan los pasos para generar certificados Java para comunicación SSL:
- Genere un certificado usando el comando keygen en Windows:
keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950
- Autocertificar el certificado:
keytool -selfcert -alias mycert -keystore server.keystore -validity 3950
- Exportar certificado a la carpeta:
keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer
- Importar certificado al almacén de confianza del cliente:
keytool -importcert -alias mycert -file mycert.cer -keystore truststore
No hay diferencia entre archivos de almacén de claves y de almacén de confianza. Ambos son archivos en el formato de archivo propietario JKS. La distinción está en el uso: hasta donde yo sé, Java solo usará el almacén al que hace referencia la -Djavax.net.ssl.trustStore
propiedad del sistema para buscar certificados en los que confiar al crear conexiones SSL. Lo mismo para las llaves y -Djavax.net.ssl.keyStore
. Pero, en teoría, está bien usar el mismo archivo para los almacenes de confianza y de claves.