in

java – ¿Qué es el almacén de claves (KeyStore)?

Screenshot63

Almacén de claves en Java puede referirse a tres cosas, dependiendo del contexto. (Todos están estrechamente relacionados pero son sutilmente diferentes).

  • Un almacén de claves puede ser un repositorio donde se pueden almacenar claves privadas, certificados y claves simétricas. Por lo general, se trata de un archivo, pero el almacenamiento también se puede manejar de diferentes maneras (por ejemplo, token criptográfico o utilizando el propio mecanismo del sistema operativo).
  • KeyStore también es una clase que forma parte de la API estándar. Es esencialmente una forma de cargar, guardar e interactuar en general con uno de los almacenes de claves «físicos» como se describe anteriormente. A KeyStore también puede estar puramente en la memoria, si solo necesita la abstracción de API para su aplicación. Cómo cargar y manipular un KeyStore instancia depende del formato del archivo de almacén de claves (u otro sistema de almacenamiento) que lo respalda. Hay varios formatos disponibles. Algunos de los más comunes son JKS y PKCS # 12 (.p12).
  • «keystore» también se puede utilizar como contraparte de «truststore». Aquí es donde puede resultar confuso, ya que tanto el «almacén de claves» como el «almacén de confianza» son almacenes de claves, simplemente se utilizan para diferentes propósitos. Puede encontrar más detalles en esta respuesta. El almacén de claves se usa para inicializar el administrador de claves, mientras que el almacén de confianza se usa para inicializar el administrador de confianza. Desde el Guía de referencia de JSSE:
    • A TrustManager determina si las credenciales de autenticación remota (y por lo tanto la conexión) deben ser confiables.
    • A KeyManager determina qué credenciales de autenticación enviar al host remoto.Básicamente, un almacén de claves utilizado como almacén de confianza contendrá una serie de certificados (CA) en los que está dispuesto a confiar: esos son los anclajes de confianza que utilizará para verificar certificados remotos que aún no conoce y en los que no confía. Por el contrario, un almacén de claves utilizado como almacén de claves contendrá su propio certificado y su clave privada: esto es lo que utilizará para autenticarse en una parte remota (cuando sea necesario). Hay un almacén de confianza predeterminado incluido con JRE (/lib/security/cacerts). No hay un almacén de claves predeterminado, ya que generalmente es un paso más explícito para el usuario.

En el contexto de SSL / TLS, un almacén de claves (almacén de claves utilizado como almacén de claves) será el lugar donde un servidor almacena su certificado y clave privada (o, cuando se utiliza la autenticación de certificado de cliente, donde el cliente almacena su certificado y clave privada). Un almacén de confianza (almacén de claves utilizado como almacén de confianza) será el lugar donde el cliente almacene los certificados de CA de las CA en las que está dispuesto a confiar, para poder verificar el certificado del servidor al realizar una conexión a un servidor SSL / TLS (de manera similar, en el lado del servidor, aquí también es donde se almacenan los certificados de CA utilizados para verificar los certificados de cliente).

Normalmente, el error que recibe («ValidatorException: PKIX path building failed«) ocurre cuando el certificado del servidor al que te estás conectando no se puede verificar con ningún certificado en el almacén de confianza que estás usando. Por lo general, deberías tener en tu almacén de confianza el certificado del servidor directamente en tu almacén de confianza (que solo se puede administrar a pequeña escala) o el certificado CA de la CA utilizado para emitir ese certificado de servidor (o uno de los certificados de la cadena que presenta, cuando hay una cadena).

¿Cómo crear, cargar y almacenar datos?

Una base de datos que contiene claves se llama Java Keystore. Estas claves, también conocidas como certificados, se suelen utilizar en el código de Java . En el código Java, estos certificados y el almacén de claves que los contiene se aplican para realizar conexiones seguras y generalmente se almacenan en varios formatos. La siguiente clase representa el almacén de claves de Java:

Almacén de claves (java.seguridad.Almacén de claves).

Las siguientes claves se mantienen en un almacén de claves de Java:

  • claves privadas 
  • Certificados y Claves Públicas
  • claves secretas

claves privadas

Las claves privadas en Java Keystore se utilizan para configurar un servidor SSL para habilitar el cifrado asimétrico.

Claves públicas

Las claves públicas en Java Keystore también se utilizan para habilitar el cifrado asimétrico. Por lo general, una clave pública corresponde a una clave privada, y esto forma un par de claves.

Certificados

Un archivo o documento que se utiliza para identificar la identidad de un dispositivo, organización o persona que afirma poseer una clave pública. La parte verificadora suele firmar digitalmente este certificado como forma de prueba.

claves secretas

Cada vez que se realiza una conexión segura, se configura una clave simétrica. Este cifrado simétrico es una clave secreta. Estas son menores en número que las claves públicas y privadas. 

Métodos del almacén de claves de Java

Los siguientes métodos se utilizan en el almacén de claves de Java:

Alias ​​de enumeración() 

Se devuelven los nombres de alias del almacén de claves actual.

booleano contiene Alias ​​(String alias)

Comprueba la presencia del alias actual en el almacén de claves.

void deleteEntry(String alias)

Este método permite la eliminación del alias del almacén de claves.

booleano entryInstanceOf(String alias, Class<? extiende KeyStore.Entry> entryClass)

Para el alias dado, este método ayuda a determinar si el alias dado es una instancia o una subclase de la clase de entrada actual.

Certificado getCertificate (String alias)

Se devuelve el certificado asociado del alias actual.

Cadena getCertificateAlias(Certificado cert)

Se devuelve el nombre de la primera entrada del almacén de claves que coincide con el certificado proporcionado.

Certificado [ ] getCertificateChain(String alias)

Se devuelve la cadena de certificados asociada con el alias actual.

Fecha getCreationDate(String alias)

Se devuelve la fecha en la que se asocia la entrada de alias especificada. 

Cadena estática getDefaultType()

Se devuelve el tipo de almacén de claves predeterminado especificado en el archivo de propiedades de seguridad de Java y, si no se encuentra ninguna propiedad, se devuelve la cadena «jks».

KeyStore.Entry getEntry(String alias, KeyStore.ProtectionParameter protParam)

Se devuelve la entrada del almacén de claves asociada al parámetro de protección especificado con el alias actual.

static KeyStore getInstance (tipo de cadena)

Se devuelve un objeto de un tipo especificado Keystore.

KeyStore estático (tipo de cadena, proveedor de proveedor)

Se devuelve un objeto de un Keystore de tipo especificado junto con el proveedor del tipo mencionado especificado.

KeyStore estático (tipo de cadena, proveedor de cadena)

Se devuelve un objeto de un tipo especificado Keystore junto con el tipo de cadena proporcionado.

Clave getKey(String alias, char [ ] contraseña)

Devuelve la clave asociada con el alias actual junto con la contraseña de recuperación.

Proveedor getProvider()

Se devuelve el proveedor del almacén de claves.

Cadena getType()

Se devuelve el tipo del almacén de claves.

booleano isCertificateEntry(String alias)

Si el método setCertificateEntry o el método setEntry con TrustedCertificateEntry crea la entrada asociada con el alias, este método devuelve verdadero; de lo contrario, devuelve falso.

booleano isKeyEntry (alias de cadena)

Si el método setKeyEntry o el método setEntry con PrivateKeyEntry o SecretKeyEntry crea la entrada asociada con el alias, este método devuelve verdadero; de lo contrario, devuelve falso.

carga vacía (flujo InputStream, char[] contraseña)

A partir del flujo de entrada dado, se carga Keystore.

carga vacía (parámetro KeyStore.LoadStoreParameter)

Desde LoadStoreParameter, el almacén de claves se carga mediante este método.

void setEntry(String alias, KeyStore.Entry entrada, KeyStore.ProtectionParameter protParam)

Este método asigna el alias de entrada del almacén de claves.

void setKeyEntry(String alias, byte[] clave, Certificate[] cadena)

La clave dada para el alias se asigna mediante este método. La clave ya protegida se pasa aquí.

void setKeyEntry(String alias, Key key, char[] contraseña, Certificate[] cadena)

La clave dada para el alias se asigna mediante este método. Este método también protege la contraseña.

tamaño int()

Este método proporciona todas las entradas presentes en Keystore.

almacén vacío (parámetro KeyStore.LoadStoreParameter)

Usando el LoadStoreParameter dado, el almacén de claves dado se almacena en este método.

tienda vacía (flujo OutputStream, char [] contraseña)

En el flujo de salida dado, este método almacena el Keystore y también lo protege usando la contraseña dada.

void setCertificateEntry(String alias, Certificate cert)

Al alias proporcionado, los certificados se asignan mediante este método.

¿Cómo crear un almacén de claves de Java?

Ahora, explorará y verá cómo crear un almacén de claves de Java.

Al llamar al método getInstance(), la instancia de Java Keystore se inicializa y, por lo tanto, se crea un Java Keystore.

La siguiente sintaxis hace el trabajo:

KeyStore almacén de claves = KeyStore.getInstance(KeyStore.getDefaultType());  

El fragmento anterior nos ayuda a crear un almacén de claves de tipo predeterminado. Los almacenes de claves de otros tipos también se pueden crear de manera similar. Lo haces de la siguiente manera:

Pasas diferentes parámetros al método getInstance().

La siguiente sintaxis sigue este patrón:

KeyStore keyStore = KeyStore.getInstance(«PKCS12»);  

¿Cómo cargar un almacén de claves de Java?

Primero debe cargar un almacén de claves de Java antes de almacenar una instancia de almacén de claves de Java. Es porque el almacenamiento de Java Keystore se realiza en un disco duro o en cualquier otro tipo de almacenamiento.

Esto se hace de la siguiente manera:

Con el método load() del almacén de claves de Java, carga el almacén de claves de Java. Este método consta de los dos parámetros siguientes:

  • Una matriz de caracteres: la contraseña del almacén de claves se almacena en esta matriz de caracteres.
  • Un InputStream: este InputStream indica la ubicación en la que se realizará la carga de datos del almacén de claves.

Esto se hace de la siguiente manera:

char [ ] contraseña = «contraseña123».toCharArray(); 

probar (datos InputStream = nuevo FileInputStream («keystore.ks»)) {  

/*keystore.ks es el archivo desde donde queremos cargar el archivo */

    keyStore.load(datos, contraseña);  

}  

El ejemplo anterior localiza el archivo keystore.ks y carga el almacén de claves almacenado en él.

Obtener claves del almacén de claves de Java

El método getEntry() se utiliza para obtener las claves de instancia de Java Keystore. Un alias protegido por contraseña que encuentra la clave se asigna a cada clave en el almacén de claves de Java. Debe proporcionar dos parámetros para acceder a cualquier clave almacenada en Java Keystore, es decir, la contraseña y el alias de la clave.

La técnica anterior se demuestra a continuación:

char [ ] contraseña = «contraseña123».toCharArray();  

KeyStore.ProtectionParameter entrada Contraseña =  

        nueva KeyStore.PasswordProtection(claveContraseña);  

KeyStore.Entry keyEntry = keyStore.getEntry(«keyAlias», entryPassword);  

Configuración de claves en Java Keystore

Usando el método setEntry, puede establecer las claves en el almacén de claves de Java. Los parámetros de este método son: una entrada de clave secreta, un alias de clave y una contraseña. 

La técnica anterior se demuestra en el siguiente código:

SecretKey secretKey = getSecretKey();  

KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey);  

keyStore.setEntry(«aliasKey», secretKeyEntry, entryPassword);  

Almacenamiento del almacén de claves de Java

Para almacenar un almacén de claves de Java para su posterior recuperación, usamos el método store(). Este Java Keystore se almacena en una base de datos o en un disco.

Esto se hace de la siguiente manera:

char [ ] keyStorePassword = «contraseña123».toCharArray();  

probar (FileOutputStream keyStoreOutputStream = new FileOutputStream(«data/keystore.ks»)) {  

    keyStore.store(keyStoreOutputStream, keyStorePassword);  

} Obtenga una base sólida en Java, el lenguaje de programación más utilizado en el desarrollo de software con el curso de capacitación para la certificación de Java .

Conclusión

Casi todo lo que usa en su vida diaria hoy en día tiene una conexión Java. Java sigue siendo uno de los más populares en la industria, con una gran demanda de ofertas de trabajo. Si quieres aprender Java y hacer de ello una carrera, echa un vistazo a esta lista de reproducción: 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

R – Sintaxis básica

gfg 200x200 min

Convierta la lista de Python en matrices numpy