Тип Keystore: какой из них использовать?

Посмотрев файл java.security моего JRE, я вижу, что тип хранилища ключей, который будет использоваться по умолчанию, устанавливается на JKS. Здесь, есть список типов хранилищ ключей, которые можно использовать.

Есть ли рекомендованный тип хранилища ключей? Каковы плюсы и минусы различных типов хранилищ ключей?

Ответ 1

Существует несколько типов, кроме перечисленных в списке стандартных имен, к которому вы привязались. Дополнительную информацию можно найти в документации для криптографических поставщиков. Наиболее распространенными являются, конечно, JKS (по умолчанию) и PKCS12 (для файлов PKCS # 12, часто с расширением .p12 или иногда .pfx).

JKS является наиболее распространенным, если вы остаетесь в мире Java. PKCS # 12 не специфичен для Java, особенно удобно использовать сертификаты (с закрытыми ключами), выполненные из браузера или поступающие из инструментов на основе OpenSSL (keytool не удалось преобразовать хранилище ключей и импортировать его закрытые ключи перед Java 6, поэтому вам пришлось использовать другие инструменты).

Если у вас уже есть файл PKCS # 12, часто проще использовать тип PKCS12. Возможно преобразование форматов, но это редко необходимо, если вы можете напрямую выбрать тип хранилища ключей.

В Java 7 PKCS12 был в основном полезен как хранилище ключей, но меньше для доверия (см. разница между хранилищем ключей и доверительным магазином), потому что вы могли 't хранить записи сертификатов без закрытого ключа. Напротив, JKS не требует, чтобы каждая запись была личным ключом, поэтому вы можете иметь записи, содержащие только сертификаты, которые полезны для хранилищ доверия, где вы храните список доверенных сертификатов (но вы не знаете, t есть закрытый ключ для них).

Это изменилось в Java 8, поэтому теперь вы можете хранить записи только для сертификатов в PKCS12. (Более подробную информацию об этих изменениях и дальнейших планах можно найти в JEP 229: Создать PKCS12 Keystores по умолчанию.)

Существует несколько других типов хранилищ ключей, возможно, менее часто используемых (в зависимости от контекста), в том числе:

  • PKCS11, для библиотек PKCS # 11, как правило, для доступа к аппаратным криптографическим маркерам, но реализация поставщика Sun также поддерживает NSS-хранилища (из Mozilla) через это.
  • BKS, используя поставщика BouncyCastle (обычно используется для Android).
  • Windows-MY/Windows-ROOT, если вы хотите напрямую обратиться к хранилищу сертификатов Windows.
  • KeychainStore, если вы хотите напрямую использовать брелок OSX.

Ответ 2

Вот сообщение, в котором представлены различные типы хранилищ ключей в Java и различия между различными типами хранилища ключей. http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----Overview

Ниже приведены описания разных хранилищ ключей из сообщения:

JKS, Java Key Store. Вы можете найти этот файл по адресу sun.security.provider.JavaKeyStore. Это хранилище ключей является специфичным для Java, оно обычно имеет расширение jks. Этот тип хранилища ключей может содержать закрытых ключей и сертификатов, но он не может использоваться для хранения секретных ключей ключи. Поскольку это конкретное хранилище ключей Java, поэтому оно не может использоваться в других языках программирования.

JCEKS, магазин ключей JCE. Вы можете найти этот файл по адресу com.sun.crypto.provider.JceKeyStore. Это хранилище ключей имеет расширение JCEKS. Записи, которые могут быть помещены в хранилище JCEKS, являются частными ключи, секретные ключи и сертификаты.

PKCS12, это стандартный тип хранилища ключей, который может использоваться в Java и Другие языки. Вы можете найти эту реализацию хранилища ключей в sun.security.pkcs12.PKCS12KeyStore. Обычно он имеет расширение p12 или pfx. Вы можете хранить секретные ключи, секретные ключи и сертификаты на этот тип.

PKCS11, это аппаратный тип хранилища ключей. Он обслуживает интерфейс для библиотека Java для подключения к аппаратным хранилищам ключей, таким как Луна, nCipher. Вы можете найти эту реализацию на sun.security.pkcs11.P11KeyStore. Когда вы загружаете хранилище ключей, вы не необходимо создать конкретного поставщика с определенной конфигурацией. Эта keystore может хранить секретные ключи, секретные ключи и cetrificates. когда загружая хранилище ключей, записи будут извлекаться из хранилища ключей а затем преобразуются в записи программного обеспечения.

Ответ 3

Если вы используете Java 8 или новее, вам определенно следует выбрать PKCS12, по умолчанию, начиная с Java 9 (JEP 229).

Преимущества по сравнению с JKS и JCEKS:

  • Секретные ключи, закрытые ключи и сертификаты можно хранить
  • PKCS12 - это стандартный формат, он может быть прочитан другими программами и библиотеками 1
  • Улучшенная безопасность: JKS и JCEKS довольно небезопасны. Это видно по количеству инструментов для перебора паролей этих типов хранилищ ключей, особенно популярных среди разработчиков Android. 2, 3

1 Существует JDK-8202837, который был исправлен в Java 11

2 Счетчик итераций для PBE, используемого всеми типами хранилищ ключей (включая PKCS12), был достаточно недельным (CVE-2017-10356), однако это было исправлено в 9.0.1, 8u151, 7u161, и 6u171

3 Для дальнейшего чтения: