Тип хранилища ключей: какой использовать?

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

JKS, хранилище ключей Java. Вы можете найти этот файл в 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 для подключения к аппаратным устройствам хранилища ключей, таким как Luna, nCipher. Вы можете найти эту реализацию в sun.security.pkcs11.P11KeyStore. Когда вы загружаете хранилище ключей, вам не нужно создавать конкретного поставщика с определенной конфигурацией. Это хранилище ключей может хранить закрытые ключи, секретные ключи и сертификаты. При загрузке хранилища ключей записи будут извлечены из хранилища ключей и затем преобразованы в записи программного обеспечения.

Если вы используете 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 Для дальнейшего чтения:

Java 11 предлагает следующие типы KeyStores:

jceks: Собственная реализация хранилища ключей, предоставляемая поставщиком SunJCE.

jks: Собственная реализация хранилища ключей, предоставляемая поставщиком SUN.

dks: Хранилище ключей домена - это набор хранилищ ключей, представленный как единое логическое хранилище ключей. Он определяется данными конфигурации, синтаксис которых описан в классе DomainLoadStoreParameter.

pkcs11: Хранилище ключей, поддерживаемое токеном PKCS # 11.

pkcs12: Синтаксис передачи личной идентификационной информации, как определено в PKCS # 12.

Источник: https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html#keystore-types.

Другие вопросы по тегам