Trust Store vs Key Store - створення за допомогою keytool


249

Я розумію, що в магазині ключів зазвичай зберігаються приватні / відкриті ключі, а трест зберігає лише відкриті ключі (і представляє список довірених сторін, з якими ви маєте намір спілкуватися). Ну, це моє перше припущення, тож якщо це неправильно, я, мабуть, почав не дуже добре ...

Мене цікавило, хоча розуміння того, як / коли ви розрізняєте магазини при використанні keytool.

Отже, я далеко створив магазин ключів, використовуючи

keytool -import -alias bob -file bob.crt -keystore keystore.ks

який створює мій файл keystore.ks. Я відповідаю yesна питання, чи я довіряю bob, але мені незрозуміло, чи це створило файл зберігання ключів або файл довіри? Я можу налаштувати свою програму для використання файлу як будь-якого.

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x

і с System.setProperty( "javax.net.debug", "ssl") набором я бачу сертифікат під довіреними сертифікатами (але не під розділом зберігання ключів). У конкретному сертифікаті, який я імпортую, є лише відкритий ключ, і я маю намір використовувати його для надсилання речей через SSL-з'єднання до Боба (але, можливо, це найкраще залишити для іншого питання!).

Будь-які вказівки чи пояснення були б вдячні. Чи є результат виводу keytool однаковим, що ви імпортуєте, і його справедливим умовою, який говорить про те, що один є магазином ключових даних, а інший довірчим магазином? Який взаємозв'язок при використанні SSL тощо?


Я не впевнений, що ви маєте на увазі під "конкретним сертифікатом, який я імпортую, є лише відкритий ключ": це просто відкритий ключ (тобто не сертифікат) чи сертифікат, що не відповідає CA?
Бруно

хммм, не впевнений. Я експортував зі свого браузера у вигляді файлу PEM. Чи допомагає це?
Тобі

Якщо він експортується з браузера, це, мабуть, сертифікат. Це сертифікат сервера (із CN або subjectAltName, що відповідає імені сервера)? Це сертифікат CA (дивіться у розділі Основні обмеження. Ви повинні мати змогу побачити це за допомогою свого браузера).
Бруно

2
tl; dr: магазини довіри містять загальнодоступні, довірені, кореневі (CA) серти, тоді як сховища ідентифікаційні / ключі містять приватні, ідентифікаційні certs; Файлово, однак вони однакові.
Андрій

Відповіді:


346

Термінологія насправді дещо заплутана, але обидві javax.net.ssl.keyStoreі javax.net.ssl.trustStoreвикористовуються для вказівки, які магазини ключів використовувати для двох різних цілей. Клавіатурні магазини бувають різних форматів і навіть не обов'язково є файлами (див. Це питання ) таkeytool це лише інструмент для виконання різних операцій над ними (імпорт / експорт / список / ...).

Параметри javax.net.ssl.keyStoreта javax.net.ssl.trustStoreпараметри - це параметри за замовчуванням, які використовуються для складання KeyManagers і TrustManagers (відповідно), потім використовуються для побудови параметрів, SSLContextякі по суті містять налаштування SSL / TLS, які слід використовувати під час з'єднання SSL / TLS через SSLSocketFactoryабо SSLEngine. Ці системні властивості - це саме те, звідки беруться значення за замовчуванням, які потім використовує SSLContext.getDefault(), сам використовується, SSLSocketFactory.getDefault()наприклад. (Все це можна налаштувати за допомогою API в декількох місцях, якщо ви не хочете використовувати значення за замовчуванням та конкретні SSLContexts для певної мети.)

Різниця між KeyManagerі TrustManager(і , таким чином , між javax.net.ssl.keyStoreі javax.net.ssl.trustStore) таким чином (цитата з JSSE керівництва REF ):

TrustManager: визначає, чи слід довіряти віддаленим обліковим записам аутентифікації (і, таким чином, з'єднанню).

KeyManager: визначає, які облікові дані автентифікації надсилати віддаленому хосту.

(Доступні інші параметри, а їхні значення за замовчуванням описані в посібнику по посилання JSSE . Зауважте, що для довіреного сховища є значення за замовчуванням, для зберігання ключів немає жодного.)

По суті, сховище ключів javax.net.ssl.keyStoreмає містити ваші приватні ключі та сертифікати, тоді як javax.net.ssl.trustStoreвоно має містити сертифікати ЦС, яким ви готові довіряти, коли віддалена сторона представляє свій сертифікат. У деяких випадках вони можуть бути одним і тим же магазином, хоча часто краще застосовувати окремі магазини (особливо коли вони базуються на файлах).


дякую за відповідь, вона трохи прояснює справи. Я все ще плутаюсь, хоча, коли справа стосується використання, я можу використовувати ключ pk12 pri / pub (xxx.p12) як магазин брелоків (через -D) та створити SSL-з'єднання (довірене) без жодної згадки про довірену крамницю через - Д ... о добре.
Тобі

57
Вам не потрібно вказувати довірену сховище, тому що для неї є значення за замовчуванням (воно в комплекті з JRE), як правило, в $JAVA_HOME/lib/security/cacerts(див. 2-е посилання довідника з посилання на JSSE, яке я надіслав). Як і веб-переглядачі, він містить набір стандартних сертифікатів CA за замовчуванням. Як правило, клієнт завжди буде використовувати довірену сховище для перевірки cert сервера, але сховище ключів використовуватиметься лише у тому випадку, якщо сервер вимагає cert клієнта, і сервер завжди буде використовувати сховище ключів для власного ключа + cert, але довірений магазин буде лише використовується, якщо клієнт надсилає клієнтський сертифікат.
Бруно

2
Дякуємо за корисну інформацію. У Weblogic є "сховище ключів ідентичності", яке зберігає сертифікат SSL сервера, а потім є "trust-key-store", який зберігає сертифікати SSL, якому сервер довіряє, тож я маю рацію, якщо кажу, що "ідентифікаційний ключ -storere - це не що інше, як "keystore", а "trust-key-store" - це не що інше, як "truststore"?
hagrawal

@Bruno також слід зазначити, що коли є "jssecacerts", "cacerts" ігнорується?
kommradHomer

61

Щоб пояснити загальноприйнятою справою / ціллю або простім способом:

TrustStore : як вказує назва, його зазвичай використовують для зберігання сертифікатів довірених осіб. Процес може підтримувати магазин сертифікатів усіх його довірених сторін, яким він довіряє.

keyStore : використовується для зберігання ключів сервера (як публічних, так і приватних) разом із підписаним сертифікатом.

Під час рукостискання SSL

  1. Клієнт намагається отримати доступ до https: //

  2. Таким чином, Сервер відповідає, надаючи сертифікат SSL (який зберігається в його keyStore)

  3. Тепер клієнт отримує сертифікат SSL і перевіряє його через trustStore (тобто клієнт trustStore вже має попередньо визначений набір сертифікатів, яким він довіряє.). Це як: Чи можна довіряти цьому серверу? Це той самий сервер, з яким я намагаюся поговорити? Ніяких нападів середньої людини?

  4. Після того, як клієнт перевіряє, що він розмовляє з сервером, якому він довіряє, то зв’язок SSL може відбуватися через спільний секретний ключ.

Примітка. Я нічого не говорю тут про аутентифікацію клієнта на стороні сервера. Якщо сервер теж хоче зробити аутентифікацію клієнта, він також підтримує trustStore для перевірки клієнта.


25

Немає різниці між файлами зберігання ключів і файлами довіри. Обидва - це файли у форматі власного файлу JKS. Відмінність полягає у використанні: Наскільки мені відомо, Java буде використовувати лише магазин, на який посилається -Djavax.net.ssl.trustStoreвластивість системи, шукати сертифікати, на які слід довіряти, коли створюються з’єднання SSL. Те саме для ключів і -Djavax.net.ssl.keyStore. Але теоретично добре використовувати один і той же файл для довіри та сховищ ключів.


4
Ви можете використовувати різні типи зберігання клавіш (наприклад, PKCS12), встановивши властивості javax.net.ssl.keyStoreTypeта javax.net.ssl.trustStoreTypeсистему.
стипендіати Доналу

1
@Donal: Гарне доповнення. Чи знаєте ви, чи є список усіх підтримуваних контейнерів? Я знаю лише PKCS12 та JKS (колишній результат - випробування та помилки ...).
musiKk

2
формати зберігання брелоків змінюються залежно від доступних постачальників (див. цей список для тих, хто постачається за замовчуванням у Oracle JRE). У цьому питанні також була дискусія . Інші постачальники (наприклад, BouncyCastle) можуть використовуватися для інших форматів.
Бруно

21

Keystore використовується сервером для зберігання приватних ключів, а Truststore використовується стороннім клієнтом для зберігання відкритих ключів, наданих сервером для доступу. Я це зробив у своєму виробництві. Нижче наведено кроки для створення Java-сертифікатів для зв'язку SSL:

  1. Створіть сертифікат за допомогою команди keygen у Windows:

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

  1. Самовивірити сертифікат:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. Експорт сертифіката в папку:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

  1. Імпорт сертифікату в клієнт Truststore:

keytool -importcert -alias mycert -file mycert.cer -keystore truststore


Привіт, у мене є один сценарій, коли у мене є два різних додатки в одному контейнері (tomcat). З обох додатків я повинен викликати інші кінцеві точки з обох сторін до кожної програми. Мовляв, від A до B і B до A (A і B - це два додатки). Чи потрібно використовувати довірчий магазин у цьому сценарії? Оскільки я використовую користувальницький клієнт для відпочинку, який використовує зберігання клавіш. Будь ласка, підкажіть.
Діпак

0

Це кроки для створення Truststore на вашому локальному апараті за допомогою Keytool. Кроки для створення довіреної сховища для URL-адреси на локальній машині.

1) Натисніть на URL-адресу браузера за допомогою chrome

2) Перевірте наявність "я" значка зліва від URL-адреси в хромі та натисніть на нього

3) Перевірте опцію сертифіката та натисніть на неї, і відкриється діалогове вікно

4) перевірте вкладку «Шлях до сертифіката» щодо кількості доступних сертифікатів для створення довіри

5) Ідіть "details" tab -> click"Copy to File" -> Give the path and the name for the certificate ви хочете створити.

6) Перевірте, чи є у батьків сертифікати та дотримуйтесь пункту "5" .

7) Після створення сертифікатів відкрийте командний рядок і перейдіть до шляху, де ви створили сертифікати.

8) надайте нижче команду Keytool, щоб додати сертифікати та створити довірену сховище.

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) Надайте команду keytool для всіх сертифікатів та додайте їх до сховища довіри.

    keytool -list -v -keystore cacerts

-1

keystore просто зберігає приватні ключі, а truststore зберігає відкриті ключі. Вам потрібно буде генерувати сертифікат java для зв'язку SSL. Ви можете використовувати команду keygen у Windows, це, мабуть, буде найпростішим рішенням.


Довірений магазин зберігає довірені сертифікати.
Маркіз Лорн

-1

Простіше кажучи:

Keystore використовується для зберігання ваших даних (сервер або клієнт), тоді як truststore використовується для зберігання інших облікових даних (сертифікати від CA).

Keystore потрібна під час налаштування серверної частини на SSL; вона використовується для зберігання посвідчення особи, яка буде подана клієнтові під час з'єднання, тоді як налаштування магазину довіри на стороні клієнта повинна містити, щоб з'єднання працювало. Якщо ви переглядаєте веб-сайт для підключення до будь-якого веб-сайту через SSL, він перевіряє сертифікат, представлений сервером, проти його довіреної сховища.

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