truststorefile not need mail from java ssl keytool jce

not - trust store java



Trust Store vs Key Store-creando con keytool (5)

La terminología es un poco confusa, pero tanto javax.net.ssl.keyStore como javax.net.ssl.trustStore se utilizan para especificar qué almacenes de claves usar, para dos propósitos diferentes. Los almacenes de claves vienen en varios formatos y no son necesariamente archivos (vea esta pregunta ), y keytool es 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 utilizados para compilar KeyManager y TrustManager s (respectivamente), luego se usan para construir un SSLContext que esencialmente contiene la configuración SSL / TLS para usar cuando realizar una conexión SSL / TLS a través de SSLSocketFactory o SSLEngine . Estas propiedades del sistema son exactamente de donde provienen los valores predeterminados, que luego utiliza SSLContext.getDefault() , que SSLContext.getDefault() utiliza, 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 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 (citada en la guía de referencia de JSSE ):

TrustManager: determina si las credenciales de autenticación remota (y, por lo tanto, la conexión) deben ser confiables.

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 hay un valor predeterminado para el almacén de confianza, no hay uno para el almacén de claves).

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

Entiendo que el almacén de claves usualmente tendrá claves privadas / públicas y que el almacén de confianza solo tendrá 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 eso no es correcto, probablemente no haya empezado muy bien ...

Sin embargo, me interesaba entender cómo / cuándo distingues las tiendas cuando usas keytool.

Así que, hasta ahora he creado un almacén de claves utilizando

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 el conjunto System.setProperty( "javax.net.debug", "ssl") configurado, puedo ver el certificado en certificaciones de confianza (pero no en la sección del almacén de claves). El certificado 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 sea mejor dejar otra pregunta!).

Cualquier punteros o aclaraciones serían muy apreciados. ¿La salida de keytool es la misma independientemente de lo que importe y su convención justa 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?


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


Para explicar en común usecase / propósito o manera laica:

TrustStore : como su nombre lo indica, normalmente se utiliza para almacenar los certificados de entidades confiables. Un proceso puede mantener un almacén de certificados de todas las partes confiables 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 apretón de manos SSL,

  1. Un cliente intenta acceder a https: //

  2. Y así, el servidor responde proporcionando un certificado SSL (que se almacena en su keyStore)

  3. Ahora, el cliente recibe el certificado SSL y lo verifica a través de trustStore (es decir, el almacén de confianza del cliente ya tiene un conjunto de certificados predefinidos en los que confía). Es como: ¿Puedo confiar en este servidor? ¿Es este el mismo servidor con el que estoy tratando de hablar? ¿Ningún hombre medio ataca?

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

Nota: No estoy hablando aquí de nada acerca de la autenticación del cliente en el lado del servidor. Si un servidor también quiere realizar una autenticación de cliente, entonces el servidor también mantiene un trustStore para verificar el cliente.


Un servidor utiliza el almacén de claves para almacenar claves privadas, y un cliente de terceros utiliza el almacén de confianza para almacenar las 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. Genere un certificado usando el comando keygen en Windows:

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

  1. Auto certificar el certificado:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. Exportar certificado a la carpeta:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

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

keytool -importcert -alias mycert -file mycert.cer -keystore truststore


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