Diferencia entre un almacén de claves de Java y un almacén de confianza

Parte superior de Java

Acabo de anunciar el nuevo curso Learn Spring , centrado en los fundamentos de Spring 5 y Spring Boot 2:

>> VER EL CURSO

1. Información general

En este artículo rápido, proporcionaremos una descripción general de las diferencias entre un almacén de claves de Java y un almacén de confianza de Java.

2. Conceptos

En la mayoría de los casos, usamos un almacén de claves y un almacén de confianza cuando nuestra aplicación necesita comunicarse a través de SSL / TLS .

Por lo general, estos son archivos protegidos con contraseña que se encuentran en el mismo sistema de archivos que nuestra aplicación en ejecución. El formato predeterminado utilizado para estos archivos es JKS hasta Java 8 .

Sin embargo, desde Java 9, el formato de almacén de claves predeterminado es PKCS12 . La mayor diferencia entre JKS y PKCS12 es que JKS es un formato específico de Java, mientras que PKCS12 es una forma estandarizada e independiente del idioma de almacenar claves y certificados privados cifrados.

3. Java KeyStore

Un almacén de claves de Java almacena entradas de claves privadas, certificados con claves públicas o simplemente claves secretas que podemos utilizar para diversos fines criptográficos. Almacena cada uno con un alias para facilitar la búsqueda.

En términos generales, los almacenes de claves contienen claves que posee nuestra aplicación y que podemos usar para probar la integridad de un mensaje y la autenticidad del remitente, por ejemplo, mediante la firma de cargas útiles.

Por lo general, usaremos un almacén de claves cuando somos un servidor y queremos usar HTTPS . Durante un protocolo de enlace SSL, el servidor busca la clave privada en el almacén de claves y presenta su clave pública y certificado correspondientes al cliente.

En consecuencia, si el cliente también necesita autenticarse a sí mismo, una situación llamada autenticación mutua, el cliente también tiene un almacén de claves y también presenta su clave pública y certificado.

No hay un almacén de claves predeterminado, por lo que si queremos usar un canal cifrado, tendremos que configurar javax.net.ssl.keyStore y javax.net.ssl.keyStorePassword. Si nuestro formato de almacén de claves es diferente al predeterminado, podríamos usar javax.net.ssl.keyStoreType para personalizarlo.

Por supuesto, también podemos utilizar estas claves para atender otras necesidades. Las claves privadas pueden firmar o descifrar datos, y las claves públicas pueden verificar o cifrar datos. Las claves secretas también pueden realizar estas funciones. Un almacén de claves es un lugar donde podemos guardar estas claves.

También podemos interactuar con el almacén de claves mediante programación.

4. Java TrustStore

Un almacén de confianza es lo opuesto: mientras que un almacén de claves generalmente retiene certificados que nos identifican, un almacén de confianza retiene certificados que identifican a otros.

En Java, lo usamos para confiar en el tercero con el que nos vamos a comunicar.

Tome nuestro ejemplo anterior. Si un cliente habla con un servidor basado en Java a través de HTTPS, el servidor buscará la clave asociada en su almacén de claves y presentará la clave pública y el certificado al cliente.

Nosotros, el cliente, buscamos el certificado asociado en nuestro almacén de confianza. Si el certificado o las autoridades de certificación presentadas por el servidor externo no se encuentran en nuestro almacén de confianza, obtendremos una SSLHandshakeException y la conexión no se configurará correctamente.

Java ha incluido un almacén de confianza llamado cacerts y reside en el directorio $ JAVA_HOME / jre / lib / security .

Contiene autoridades de certificación de confianza predeterminadas:

$ keytool -list -keystore cacerts Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 92 entries verisignclass2g2ca [jdk], 2018-06-13, trustedCertEntry, Certificate fingerprint (SHA1): B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D

Vemos aquí que el almacén de confianza contiene 92 entradas de certificado de confianza y una de las entradas es la entrada verisignclass2gca . Esto significa que la JVM confiará automáticamente en los certificados firmados por verisignclass2g2ca .

Aquí, podemos anular la ubicación predeterminada del almacén de confianza mediante la propiedad javax.net.ssl.trustStore . De manera similar, podemos configurar javax.net.ssl.trustStorePassword y javax.net.ssl.trustStoreType para especificar la contraseña y el tipo del almacén de confianza.

5. Conclusión

En este tutorial, discutimos las principales diferencias entre el almacén de claves de Java y el almacén de confianza de Java y su propósito.

Además, mostramos cómo los valores predeterminados se pueden anular con las propiedades del sistema.

A continuación, podríamos echar un vistazo a la siguiente guía SSL o la Guía de referencia JSSE para obtener más detalles sobre la comunicación cifrada en Java.

Fondo de Java

Acabo de anunciar el nuevo curso Learn Spring , centrado en los fundamentos de Spring 5 y Spring Boot 2:

>> VER EL CURSO