Keystore в java

Що таке Java Keystore?

Keystore використовується для зберігання власних приватних ключів і сертифікатів сервера або клієнта.

Для аутентифікації клієнта і сервера встановлюють SSL з'єднання потрібні приватні ключі та сертифікати. Якщо використовується одностороння аутентифікація, то keystore потрібен тільки на серверній стороні. При двосторонньої аутентифікації і клієнт і сервер обмінюються сертифікатами, відповідно і у сервера, і у клієнта повинен бути keystore з парою приватний ключ / публічний ключ + сертифікат.

Тобто іншими словами Keystore використовується для зберігання ключів і сертифікатів, що використовуються для ідентифікації власника ключа (клієнта або сервера).

Trust Store

Другий тип keystore застосовується для зберігання trusted сертифікатів. У нього кладуться ключі trusted certificate authorities CA. При користуванні самоподпісанного сертифікатами, в trusted store може класти самоподпісанний сертифікат. Це теж keystore, але в Java він називається trusted store.

Формати Keystore підтримувані Java

Т.ч. як описано вище, keystore - контейнер, який використовується для зберігання ключів і сертифікатів. Java підтримує два формати keystore:

  • JKS (Java Key Store) - Java format
  • PKCS12 - this is an industry standard

Тип keystore, який використовується за умовчанням, задається в Java security properties файлі властивістю keystore.type. Якщо додаток звертається до key store файлу без явної вказівки його типу, використовується JKS формат. Java security properties файл розташований в каталозі lib всередині інсталяційного директорія з Java шляхом: /lib/security/java.security

Для роботи з keystore в java дистрибутиві є спеціальна утиліта keytool. Keytool цілком достатньо для операцій з ключами в Java. Однак JKS формат є пропіетарним і закритим. Тому часто для різноманітних конвертацій і взаємодії зі сторонніми розробниками можуть використовуватися утиліти, що поставляються в комплекті з бібліотекою OpenSSL.

У тих випадках, коли планується використовувати ключі виключно в Java keystore в форматі JKS цілком підійде.

Keystore (принаймні в JKS форматі), дозволяє зберігати кілька пар ключів і сертифікатів. Для ідентифікації кожної пари або окремого сертифіката використовується алиас. Алиас вказується в вихідному коді при доступі до відповідного ключу або сертифікату. Доступ до кожного АЛІАС обмежується паролем.

створення keystore

Процес генерації keystore (JKS або PKS12) включає генерацію пари ключів (приватного і публічного). Потім отримання від Certificate Authority (CA) підписи до публічного ключу і пов'язаної з ним ідентифікуючої інформації у вигляді сертифіката. Certificate authority генерує сертифікат на основі публічного ключа і ідентифікаційної інформації, переданої йому у вигляді CSR.

Wikipedia каже, що CA видає сертифікат, який прив'язує публічний ключ до зазначеного Distinguished Name (це може бути ім'я хоста (hostname, ім'я користувача або назву програми). Кроки по створенню keystore представляє користувача, додаток або хост наступні:

1) Згенерувати пару ключів (public / private key)

У java при генерації пари ключів за допомогою keytool відразу створюється самоподпісанний self-signed сертифікат, який можна негайно використовувати для тестування. Наступні кроки, таким чином, потрібні тільки для створення повноцінного офіційного сертифікату.

2) Згенерувати запит на отримання сертифіката (Certificate Signing Request (CSR)).

3) Отримати CSR, підписаний довіреною CA (output of this is a certificate)

4) Імпортувати сертифікат, зроблений CA в ваш key store.

5) Імпортувати сертифікат CA в ваш truststore як trusted certificate

Java's Default Keystore

Веб-сервер або додаток може сказати Java використовувати заданий keystore файл установкою властивості javax.net.ssl.keyStore. (Вказується шлях до файлу keystore). Якщо програма не вкаже keystore property, тоді завантажується keystore за замовчуванням. Keystore за замовчуванням зберігається у файлі .keystore в призначеному для користувача домашньому директорії, який визначається в свою чергу системним властивістю user.home.

Java's Default Truststore

Додаток може вказати Java використовувати певний truststore файл установкою властивості javax.net.ssl.trustStore. Якщо програма не вказує явно truststore, тоді truststore за замовчуванням запускається також. За замовчуванням java truststore знаходиться в / lib / security / cacerts і його пароль за замовчуванням: 'changeit'. Файли truststore - звичайні keystore файли, що містять один або більше сертифікатів trusted CA (Certificate Authorities).

Для полегшення створення та управління keystore файлами в дистрибутив Java входить утиліта keytool, що дозволяє створювати JKS файли. Keytool дозволяє управління сертифікатами і парами публічних приватних ключів.

З опцією -genkey, keytool генерує нову пару public / private ключів, і для public ключа створює self-signed сертифікат.

Сертифікат створюється в форматі X.509. У цьому форматі в якості ідентифікатора власника використовується Distinquished Name або просто DN в форматі X.500. Точно такий же формат ідентифікації об'єктів використовується, наприклад в LDAP-протоколі або в SNMP. Distinquished Name задається у вигляді розділених через кому атрибутів: «CN = Andrey Chesnokov, OU = dev64, O = dev64-wordpress, L = Unknown, ST = Unknown, C = RU». Тут окремі атрибути розшифровуються так:

  • CN - common name ім'я власника
  • OU - organizationUnit (e.g, department or division) департамент або відділ
  • O - organizationName - large organization name, e.g. «ABCSystems, Inc.»
  • L - localityName - locality (city) name, e.g. «Palo Alto» місце розташування (місто)
  • ST - stateName - state or province name, e.g. «California»
  • C - country - two-letter country code, e.g. «CH»

Частина з атрибутів можуть бути пропущені, в даному випадку їм присвоєно значення Unknown. При генерації тестового keystore, значення можна привласнювати будь-які. При отриманні офіційного сертифікату, дані регламентуються і перевіряються Certificate Authority організацією.

Усередині кожного сертифіката в форматі X.509 зберігається пара Distinqueshed Names (DN), один DN належить власнику сертифіката, а другий DN вказує ідентифікатор CA, яка підписала сертифікат. У випадку з self-signed сертифікатом, обидва ці DN вказують на власника сертифіката.

Distinquished Name задається keytool за допомогою опції -dname. Якщо опцію dname й вказати, тоді keytool запросить всі необхідні поля з командного рядка.

Опція keystore задає ім'я keystore файлу. Якщо її пропустити, тоді keytool створить файл з ім'ям .keystore в домашньому директорії користувача.

Доступ до keystore захищається паролем. Відповідно опція -keypass вказує пароль для доступу до keystore цілком. Цей пароль необхідний для можливості читання або модифікації keystore.

Другий пароль, як уже говорилося вище, необхідний для доступу до окремого АЛІАС всередині keystore. Цей другий пароль вказується за допомогою опції -keypass.

Т.ч. за допомогою однієї команди виходить keystore з парою ключів і сертифікатом, залишається цей keystore взяти і підкласти в потрібний каталог до своєї програми. Але це вже інша історія.

Обов'язково варто почитати офіційну документацію на keytool, вона містить багато корисного.

Деякі команди для роботи з сертифікатами: