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

115

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

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

Микаэль Марраш
источник
4
Начиная с Java 9, PKCS12 является типом хранилища ключей по умолчанию. Это изменение связано с целью JEP 229: «Повышение безопасности. PKCS12 предлагает более надежные криптографические алгоритмы, чем JKS». Для получения дополнительной информации см. «JEP 229: Создание хранилищ ключей PKCS12 по умолчанию», openjdk.java.net/jeps/229 ; последний доступ 2 февраля 2018 г.
buzz3791 01

Ответы:

142

Типов несколько больше, чем указано в стандартном списке имен, с которым вы связались. Вы можете найти больше в документации провайдеров криптографии . Наиболее распространенными являются 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.
Bruno
источник
7
@husayt, сертификаты PEM напрямую не поддерживаются как типы хранилищ ключей (я полагаю, можно было бы написать KeyStoreреализацию для этого). Однако вы можете загружать их на лету в экземпляр хранилища ключей (обычно JKS, тип по умолчанию) в памяти с помощью CertificateFactory(как показано в этом ответе ).
Bruno
я думаю, что JKSон изменился наJCEKS
амфибия
5
Скорее всего, хранилище ключей JKS не может хранить секретные ключи. Для этого варианта использования подходит JCEKS. Возможно, стоит упомянуть об этом в своем ответе.
Дункан Джонс
1
Хорошо. В Java 8 я могу без проблем создать хранилище ключей PKCS # 12 с одним сертификатом. Обратите внимание, что для записей сертификатов P12 неявно доверяют. Если вам нужны ненадежные сертификаты, возможно, вам придется вернуться к схеме с несколькими хранилищами ключей.
Maarten Bodewes
2
Хорошо, по крайней мере, для хранилищ ключей Java 8 PKCS # 12 все еще не могут хранить записи секретных ключей . Вы получите исключение нулевого указателя при сохранении такого хранилища ключей (тьфу), вероятно, потому что он не может найти связанные сертификаты. Кто-то вроде бы пропустил учение Джошуа о отказоустойчивом коде.
Maarten Bodewes
22

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

PixelsTech
источник
@ peci1 Я планировал написать несколько руководств по использованию этих хранилищ ключей. Пока что я написал один пост для JKS, его можно найти по адресу Pixelstech.net/article/…
PixelsTech
@PixelsTech Я нашел этот и подумал, а где остальные :) Так что я буду следить за обновлениями;) Спасибо
Мартин Пека
1
@ peci1 Сегодня я рассказал о JCEKS и PKCS12. Для PKCS11 это включает в себя оборудование и дополнительную настройку, требуется больше времени на ее создание. Pixelstech.net/article/… и Pixelstech.net/article/…
PixelsTech
Вау, это молниеносно! Огромное спасибо.
Мартин Пека
5

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

Marcono1234
источник