Trust Store vs Key Store-crear con keytool


Entiendo que el almacén de claves suele contener claves privadas/públicas y el almacén de confianza solo claves públicas (y representa la lista de partes de confianza con las que pretende comunicarse). Bueno, esa es mi primera suposición, así que si eso no es correcto, probablemente no he empezado muy bien...

Sin embargo, estaba interesado en comprender cómo / cuándo se distinguen las tiendas cuando se usa keytool.

Hasta ahora he creado un almacén de claves usando

keytool -import -alias bob -file bob.crt -keystore keystore.ks

Que crea mi keystore.archivo ks. Respondo yes a la pregunta ¿confío en Bob pero no me queda claro si esto ha creado un archivo keystore o un archivo truststore? 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") establecido, puedo ver el certificado en certificaciones de confianza (pero no en la sección almacén de claves). El certificado en particular que estoy importando solo tiene 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 es mejor dejarlo para otra pregunta!).

Cualquier sugerencia o aclaración sería muy apreciada. ¿Es la salida de keytool la misma que importa y su 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 al usar SSL, etc.?

Author: ROMANIA_engineer, 2011-06-14

5 answers

La terminología es un poco confusa, pero tanto javax.net.ssl.keyStore como 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 (ver esta pregunta), y keytool es solo una herramienta para realizar varias operaciones en ellos (import/export/list/...).

Los parámetros javax.net.ssl.keyStore y javax.net.ssl.trustStore son los parámetros predeterminados utilizados para construir KeyManager s y TrustManager s (respectivamente), luego utilizados para construir un SSLContext que esencialmente contiene la configuración de SSL / TLS a usar al hacer una conexión SSL/TLS a través de un SSLSocketFactory o un SSLEngine. Estas propiedades del sistema son justo de donde vienen los valores predeterminados, que luego es utilizado por SSLContext.getDefault(), a su vez utilizado por SSLSocketFactory.getDefault() por ejemplo. (Todo esto se puede personalizar a través de la API en varios lugares, si no desea usar los valores predeterminados y los SSLContextespecí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 como sigue (citado de la guía de referencia de JSSE ):

TrustManager: Determina si el credenciales de autenticación remota (y por lo tanto, la conexión) debe ser fiable.

KeyManager: Determina cuál credenciales de autenticación a las que enviar el host remoto.

(Otros parámetros están disponibles y sus valores predeterminados se describen en la guía JSSE ref . Tenga en cuenta que si bien hay un valor predeterminado para el almacén de confianza, no hay una para la tienda de llaves.)

Esencialmente, el almacén de claves en javax.net.ssl.keyStore está destinado a contener sus claves privadas y certificados, mientras que el 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 una y la misma tienda, aunque a menudo es mejor usar tiendas distintas (especialmente cuando están basadas en archivos).

 268
Author: Bruno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:33

No hay diferencia entre los archivos keystore y truststore. Ambos son archivos en el formato de archivo propietario JKS. La distinción está en el uso: A mi leal saber y entender, Java solo utilizará la tienda a la que hace referencia javax.net.ssl.trustStore para buscar certificados en los que confiar al crear conexiones SSL. Lo mismo para las claves y javax.net.ssl.keyStore. Pero en teoría, está bien usar el mismo archivo para la confianza y los almacenes de claves.

 22
Author: musiKk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-14 08:35:27

Para explicar en común usecase / purpose o manera laica:

TrustStore : Como su nombre indica, normalmente se usa para almacenar los certificados de entidades de confianza. Un proceso puede mantener un almacén de certificados de todas sus partes de confianza en la que confía.

KeyStore: Se utiliza para almacenar las claves del servidor (tanto públicas como privadas) junto con el certificado firmado.

Durante el apretón de manos SSL,

  1. Un cliente intenta acceder https://

  2. Y por lo tanto, el servidor responde proporcionando un certificado SSL (que se almacena en su almacén de claves)

  3. 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 tratando de hablar ? ¿No hay ataques de intermediarios ?

  4. Una vez, el cliente verifica que está hablando con servidor en el que confía, entonces la comunicación SSL puede ocurrir sobre una clave secreta compartida.

Nota : No estoy hablando aquí nada sobre la autenticación del cliente en el lado del servidor. Si un servidor también desea realizar una autenticación de cliente, el servidor también mantiene un almacén de confianza para verificar el cliente.

 20
Author: Balaji Boggaram Ramanarayan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-16 19:18:47

Keystore es utilizado por un servidor para almacenar claves privadas, y truststore es utilizado por un cliente de terceros 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 muestran los pasos para generar certificados java para la comunicación SSL:

  1. Generar un certificado usando el comando keygen en windows:

Keytool-genkey-keystore server.keystore-alias mycert-20161109-keyalg RSA-keysize 2048-validity 3950

  1. Auto certificar el certificado:

Keytool-selfcert-alias mycert-20161109-keystore server.keystore-validez 3950

  1. Exportar certificado a la carpeta:

Keytool-export-alias mycert-20161109-keystore server.keystore-rfc-file mycert-20161109.cer

  1. Importar certificado en el almacén de confianza del cliente:

Keytool-importcert-alias mycert-20161109-file C:\certs\mycert-20161109 -keystore .truststore

 9
Author: Akash5288,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-02 16:25:49

Keystore simplemente almacena claves privadas, mientras que truststore almacena claves públicas. Usted querrá generar un certificado java para la comunicación SSL. Puede utilizar un comando keygen en Windows, esta será probablemente la solución más fácil.

 1
Author: Team END_TECH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-19 13:58:07