Тип хранилища ключей: какой использовать?
Смотря на файл 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 предлагает следующие типы
KeyStore
s:
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.