Tipo de almacén de claves: ¿cuál usar?

115

Al mirar el archivo java.securityde mi JRE, veo que el tipo de almacén de claves que se utilizará de forma predeterminada está configurado en JKS. Aquí , hay una lista de los tipos de almacén de claves que se pueden utilizar.

¿Existe un tipo de almacén de claves recomendado? ¿Cuáles son las ventajas y desventajas de los diferentes tipos de almacenes de claves?

Mickael Marrache
fuente
4
Desde Java 9, PKCS12 es el tipo de almacén de claves predeterminado. Este cambio es para el objetivo de JEP 229: "Mejorar la seguridad. PKCS12 ofrece algoritmos criptográficos más fuertes que JKS". Para obtener más información, consulte "JEP 229: Crear almacenes de claves PKCS12 de forma predeterminada", openjdk.java.net/jeps/229 ; consultado por última vez el 2 de febrero de 2018.
buzz3791

Respuestas:

142

Hay algunos tipos más de los que figuran en la lista de nombres estándar a la que ha vinculado. Puede encontrar más en la documentación de proveedores de cifrado . Los más comunes son ciertamente JKS(los predeterminados) y PKCS12(para archivos PKCS # 12, a menudo con extensión .p12o, a veces .pfx).

JKS es el más común si te quedas dentro del mundo de Java. PKCS # 12 no es específico de Java, es particularmente conveniente usar certificados (con claves privadas) respaldados desde un navegador o que provienen de herramientas basadas en OpenSSL ( keytoolno se pudo convertir un almacén de claves e importar sus claves privadas antes de Java 6 , por lo que tuvo que usar otras herramientas).

Si ya tiene un archivo PKCS # 12, a menudo es más fácil usar el PKCS12tipo directamente. Es posible convertir formatos, pero rara vez es necesario si puede elegir el tipo de almacén de claves directamente.

En Java 7, PKCS12era principalmente útil como almacén de claves, pero menos para un almacén de confianza (vea la diferencia entre un almacén de claves y un almacén de confianza ), porque no se pueden almacenar entradas de certificado sin una clave privada. Por el contrario, JKSno requiere que cada entrada sea una entrada de clave privada, por lo que puede tener entradas que contengan solo certificados, lo cual es útil para almacenes de confianza, donde almacena la lista de certificados en los que confía (pero no tiene el clave privada para ellos).

Esto ha cambiado en Java 8, por lo que ahora también puede tener entradas de solo certificado en las PKCS12tiendas. (Se pueden encontrar más detalles sobre estos cambios y otros planes en JEP 229: Crear almacenes de claves PKCS12 de forma predeterminada ).

Hay algunos otros tipos de almacenes de claves, quizás de uso menos frecuente (según el contexto), entre los que se incluyen:

  • PKCS11, para bibliotecas PKCS # 11, generalmente para acceder a tokens criptográficos de hardware, pero la implementación del proveedor Sun también admite tiendas NSS (de Mozilla) a través de esto.
  • BKS, utilizando el proveedor BouncyCastle (comúnmente utilizado para Android).
  • Windows-MY/ Windows-ROOT, si desea acceder directamente al almacén de certificados de Windows.
  • KeychainStore, si desea utilizar el llavero OSX directamente.
Bruno
fuente
7
@husayt, los certificados PEM no se admiten directamente como tipos de almacén de claves (supongo que se podría escribir una KeyStoreimplementación a tal efecto). Sin embargo, puede cargarlos sobre la marcha en una instancia de almacén de claves (generalmente JKS, el tipo predeterminado) en la memoria usando un CertificateFactory(como se muestra en esta respuesta ).
Bruno
Creo que JKSha cambiado aJCEKS
anfibio
5
Más bien críticamente, un almacén de claves JKS no puede almacenar claves secretas. Para este caso de uso, JCEKS es apropiado. Puede valer la pena mencionar esto en su respuesta.
Duncan Jones
1
Okay. En Java 8 puedo crear un almacén de claves PKCS # 12 con un solo certificado sin ningún problema. Tenga en cuenta que para las entradas de certificado P12 se confía implícitamente. Si necesita certificados que no sean de confianza, es posible que deba volver a un esquema con varios almacenes de claves.
Maarten Bodewes
2
OK al menos para Java 8 PKCS # 12, los almacenes de claves aún no pueden almacenar entradas de claves secretas . Obtendrá una excepción de puntero nulo al almacenar dicho almacén de claves (ugh), probablemente porque no puede encontrar los certificados asociados. Al parecer, alguien se saltó las enseñanzas de Joshua sobre el código de falla rápida.
Maarten Bodewes
22

Aquí hay una publicación que presenta diferentes tipos de almacén de claves en Java y las diferencias entre los diferentes tipos de almacén de claves. http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----

A continuación se muestran las descripciones de los diferentes almacenes de claves de la publicación:

JKS, Java Key Store. Puede encontrar este archivo en sun.security.provider.JavaKeyStore. Este almacén de claves es específico de Java, normalmente tiene una extensión de jks. Este tipo de almacén de claves puede contener claves privadas y certificados, pero no se puede utilizar para almacenar claves secretas. Dado que es un almacén de claves específico de Java, no se puede utilizar en otros lenguajes de programación.

JCEKS, almacén de claves JCE. Puede encontrar este archivo en com.sun.crypto.provider.JceKeyStore. Este almacén de claves tiene una extensión de jceks. Las entradas que se pueden colocar en el almacén de claves JCEKS son claves privadas, claves secretas y certificados.

PKCS12, este es un tipo de almacén de claves estándar que se puede utilizar en Java y otros lenguajes. Puede encontrar esta implementación de almacén de claves en sun.security.pkcs12.PKCS12KeyStore. Suele tener una extensión de p12 o pfx. Puede almacenar claves privadas, claves secretas y certificados en este tipo.

PKCS11, este es un tipo de almacén de claves de hardware. Sirve una interfaz para que la biblioteca de Java se conecte con dispositivos de almacenamiento de claves de hardware como Luna, nCipher. Puede encontrar esta implementación en sun.security.pkcs11.P11KeyStore. Cuando carga el almacén de claves, no necesita crear un proveedor específico con una configuración específica. Este almacén de claves puede almacenar claves privadas, claves secretas y cetrificados. Al cargar el almacén de claves, las entradas se recuperarán del almacén de claves y luego se convertirán en entradas de software.

PixelsTech
fuente
@ peci1 He planeado escribir algunos tutoriales sobre cómo usar estos almacenes de claves. Hasta ahora he escrito una publicación para JKS, encuéntrela en pixelstech.net/article/…
PixelsTech
@PixelsTech Encontré este y me preguntaba dónde están el resto :) Así que estaré atento;) Gracias
Martin Pecka
1
@ peci1 Hoy he cubierto JCEKS y PKCS12. Para PKCS11, implica hardware y configuración adicional, necesita más tiempo para componerlo. pixelstech.net/article/… y pixelstech.net/article/…
PixelsTech
¡Vaya, eso es la velocidad del rayo! Muchas gracias.
Martin Pecka
5

Si está utilizando Java 8 o más reciente, definitivamente debería elegir PKCS12, el predeterminado desde Java 9 ( JEP 229 ).

Las ventajas en comparación con JKSy JCEKSson:

  • Se pueden almacenar claves secretas, claves privadas y certificados
  • PKCS12es un formato estándar, puede ser leído por otros programas y bibliotecas 1
  • Seguridad mejorada: JKSy JCEKSson bastante inseguros. Esto se puede ver por la cantidad de herramientas para forzar contraseñas de estos tipos de almacén de claves, especialmente populares entre los desarrolladores de Android. 2, 3

1 Hay JDK-8202837 , que se ha corregido en Java 11

2 El recuento de iteraciones para PBE utilizado por todos los tipos de almacén de claves (incluido PKCS12) solía ser bastante semanal ( CVE-2017-10356 ), sin embargo, esto se ha corregido en 9.0.1, 8u151, 7u161 y 6u171

3 Para leer más:

Marcono1234
fuente