Тип магазинного магазину: який використовувати?


115

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

Чи є рекомендований тип зберігання брелоків? Які плюси / мінуси для різних типів магазинів?


4
Оскільки Java 9, PKCS12 є типом зберігання ключів за замовчуванням. Ця зміна полягає в цілі JEP 229: "Поліпшення безпеки. PKCS12 пропонує більш сильні криптографічні алгоритми, ніж JKS". Для отримання додаткової інформації див. "JEP 229: Створення клавіатур PKCS12 за замовчуванням", openjdk.java.net/jeps/229 ; Останнє звернення 2 лютого 2018 р.
buzz3791

Відповіді:


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.

7
@husayt, PEM-сертифікати не підтримуються безпосередньо як типи брелоків (я думаю, можна було б написати KeyStoreреалізацію для цього ефекту). Однак ви можете завантажувати їх на льоту в екземпляр зберігання брелоків (як правило, JKS, тип за замовчуванням) в пам'яті, використовуючи CertificateFactory(як показано в цій відповіді ).
Бруно

Я думаю, що JKSзмінився наJCEKS
амфібій

5
Доволі критично, магазин ключів JKS не може зберігати секретні ключі. Для цього випадку використання JCEKS підходить. Це, можливо, варто згадати у своїй відповіді.
Дункан Джонс

1
Гаразд. У Java 8 я можу створити сховище ключів PKCS # 12 з одним сертифікатом без жодних проблем. Зауважте, що для записів сертифікатів P12 неявно довіряти. Якщо вам потрібні недовірені серти, можливо, вам доведеться повернутися до схеми з декількома магазинами ключів.
Maarten Bodewes

2
Добре, щонайменше, для ключів Java 8 PKCS # 12 все ще не може зберігати секретні записи ключів . Ви отримаєте нульовий виняток вказівника під час зберігання такого сховища ключів (ugh), ймовірно, тому, що він не може знайти пов'язані сертифікати. Хтось, здавалося б, пропустив навчання Джошуа про невдалий швидкий код.
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. Коли ви завантажуєте сховище ключів, вам не потрібно створювати конкретного постачальника із конкретною конфігурацією. У цьому магазині ключів можна зберігати приватні ключі, секретні ключі та цетрифікати. Під час завантаження сховища ключів записи будуть вилучені з сховища ключів і потім перетворені в записи програмного забезпечення.


@ 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 Для подальшого читання:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.