Entiendo que el almacén de claves generalmente contendría claves privadas / públicas y el almacén de confianza solo las claves públicas (y representa la lista de partes de confianza con las que tiene la intención de comunicarse). Bueno, esa es mi primera suposición, así que si eso no es correcto, probablemente no haya comenzado muy bien ...
Sin embargo, estaba interesado en comprender cómo / cuándo distingue las tiendas cuando usa keytool.
Entonces, 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 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 dejarlo para otra pregunta!).
Cualquier sugerencia o aclaración sería muy apreciada. ¿La salida de keytool es la misma que importa y es solo 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.?
Respuestas:
La terminología es un poco confusa, pero ambas
javax.net.ssl.keyStore
yjavax.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 (vea esta pregunta ), ykeytool
es solo una herramienta para realizar varias operaciones en ellos (importar / exportar / lista / ...).Los parámetros
javax.net.ssl.keyStore
yjavax.net.ssl.trustStore
son los parámetros predeterminados que se usan para construirKeyManager
s yTrustManager
s (respectivamente), y luego se usan para construir unoSSLContext
que esencialmente contiene la configuración SSL / TLS para usar cuando se realiza una conexión SSL / TLS a través de anSSLSocketFactory
o anSSLEngine
. Estas propiedades del sistema son exactamente de donde provienen los valores predeterminados, que luego son utilizados por ellosSSLContext.getDefault()
mismos, porSSLSocketFactory.getDefault()
ejemplo. (Todo esto se puede personalizar a través de la API en varios lugares, si no desea utilizar los valores predeterminados y los específicosSSLContext
para un propósito determinado).La diferencia entre
KeyManager
yTrustManager
(y, por lo tanto, entrejavax.net.ssl.keyStore
yjavax.net.ssl.trustStore
) es la siguiente (citado de la guía de referencia JSSE ):(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
javax.net.ssl.keyStore
está destinado a contener sus claves privadas y certificados, mientras quejavax.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 sola tienda, aunque a menudo es una mejor práctica usar tiendas distintas (especialmente cuando están basadas en archivos).fuente
$JAVA_HOME/lib/security/cacerts
(consulte el enlace de la segunda guía de referencia JSSE que envié). Al igual que los navegadores, contiene un conjunto predeterminado de certificados de CA confiables. En general, un cliente siempre usará un almacén de confianza para verificar el certificado del servidor, pero el almacén de claves solo se usará si el servidor solicita un certificado de cliente, y el servidor siempre usará un almacén de claves para su propia clave + cert, pero el almacén de confianza solo será se usa si el cliente envía un certificado de cliente.Para explicar de manera común el caso de uso / propósito o laico:
Durante el protocolo de enlace SSL,
Un cliente intenta acceder a https: //
Y por lo tanto, 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 tratando de hablar? ¿No hay ataques de intermediarios?
Una vez, el cliente verifica que está hablando con el servidor en el que confía, entonces la comunicación SSL puede ocurrir a través de una clave secreta compartida.
Nota: No estoy hablando aquí sobre la autenticación del cliente en el lado del servidor. Si un servidor también quiere hacer una autenticación de cliente, entonces el servidor también mantiene un TrustStore para verificar el cliente.
fuente
No hay diferencia entre el almacén de claves y los archivos del almacén de confianza. Ambos son archivos en el formato de archivo JKS patentado. La distinción está en el uso: que yo sepa, Java solo usará el almacén al que hace referencia la
-Djavax.net.ssl.trustStore
propiedad del sistema para buscar certificados de confianza 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 almacenes de confianza y claves.fuente
javax.net.ssl.keyStoreType
yjavax.net.ssl.trustStoreType
las propiedades del sistema.Keystore es utilizado por un servidor para almacenar claves privadas, y Truststore es utilizado por un cliente externo 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 la comunicación SSL:
keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950
keytool -selfcert -alias mycert -keystore server.keystore -validity 3950
keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer
keytool -importcert -alias mycert -file mycert.cer -keystore truststore
fuente
Estos son los pasos para crear un Truststore en su máquina local usando Keytool. Pasos para crear un almacén de confianza para una URL en su máquina local.
1) Presione la URL en el navegador usando Chrome
2) Verifique el ícono "i" a la izquierda de la url en Chrome y haga clic en él
3) Verifique la opción de certificado y haga clic en él y se abrirá un cuadro de diálogo
4) verifique la pestaña "ruta del certificado" para ver la cantidad de certificados disponibles para crear el almacén de confianza
5) Vaya el
"details" tab -> click"Copy to File" -> Give the path and the name for the certificate
que desea crear.6) Verifique si tiene certificados principales y siga el punto "5" .
7) Después de crear todos los certificados, abra el símbolo del sistema y navegue hasta la ruta donde creó los certificados.
8) proporcione el siguiente comando Keytool para agregar los certificados y crear un almacén de confianza.
9) Proporcione el comando keytool para todos los certificados y agréguelos al almacén de confianza.
fuente
keystore simplemente almacena claves privadas, mientras que truststore almacena claves públicas. Deberá 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.
fuente
En términos más simples:
Keystore se usa para almacenar su credencial (servidor o cliente) mientras que truststore se usa para almacenar otras credenciales (Certificados de CA).
El almacén de claves es necesario cuando configura el lado del servidor en SSL, se usa para almacenar el certificado de identidad del servidor, qué servidor presentará a un cliente en la conexión, mientras que la configuración del almacén de confianza en el lado del cliente debe contener para que la conexión funcione. Si su navegador se conecta a cualquier sitio web a través de SSL, verifica el certificado presentado por el servidor contra su almacén de confianza.
fuente