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 представляющего пользователя, приложение или хост следующие:
- Сгенерировать пару ключей (public / private key)
В java при генерации пары ключей с помощью keytool сразу создается самоподписанный self-signed сертификат, который можно немедленно использовать для тестирования. Следующие шаги, таким образом, нужны только для создания полноценного официального сертификата.
-
Сгенерировать запрос на получение сертификата (Certificate Signing Request (CSR)).
-
Получить CSR, подписанный доверенным CA (output of this is a certificate)
-
Импортировать сертификат, сделанный CA в ваш key store.
-
Импортировать сертификат 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).
Keytool
Для облегчения создания и управления keystore файлами в дистрибутив Java входит утилита keytool, позволяющая создавать JKS файлы. Keytool позволяет управление сертификатами и парами публичных приватных ключей.
С опцией -genkey, keytool генерирует новую пару public/private ключей, и для public ключа создает self-signed сертификат.
keytool -genkey -keystore server.jks -dname "CN=localhost, OU=dev64, O=dev64-wordpress, L=Unknown, ST=Unknown, C=RU" -storepass storepass -alias server-test -keypass serverpass
Сертификат создается в формате 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, она содержит много полезного.
Keytool Oracle documentation (http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/keytool.html)
Взято:
https://dev64.wordpress.com/2013/06/17/ssl-keystore-java/
Некоторые команды для работы с сертификатами:
keytool -list -keystore server.jks
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
server-test, Apr 9, 2015, PrivateKeyEntry,
Certificate fingerprint (SHA1): E3:3F:3B:D9:3B:4E:34:8E:D2:D5:D5:B6:9E:C2:86:57:DE:4D:A8:A9
keytool -export -keystore server.jks -alias server-test -storepass storepass -file server.cer
Certificate stored in file <server.cer>
keytool -import -keystore clienttrust.jks -file server.cer -storepass storepass
Owner: CN=localhost, OU=dev64, O=dev64-wordpress, L=Unknown, ST=Unknown, C=RU
Issuer: CN=localhost, OU=dev64, O=dev64-wordpress, L=Unknown, ST=Unknown, C=RU
Serial number: 16797d2
Valid from: Thu Apr 09 11:54:14 UTC 2015 until: Wed Jul 08 11:54:14 UTC 2015
Certificate fingerprints:
MD5: 72:A0:86:C9:DE:9A:E4:0C:99:B0:F9:80:F8:C4:D3:A9
SHA1: E3:3F:3B:D9:3B:4E:34:8E:D2:D5:D5:B6:9E:C2:86:57:DE:4D:A8:A9
SHA256: CC:66:89:7E:76:F4:C8:35:26:D7:E3:88:27:33:96:19:22:59:7D:63:13:D5:14:11:87:C6:80:4E:05:7B:CB:DA
Signature algorithm name: SHA1withDSA
Version: 3
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E2 20 A1 7F 0C 55 A4 18 43 25 73 17 CE E4 E8 72 . ...U..C%s....r
0010: 93 73 F4 00 .s..
]
]
Trust this certificate? [no]: y
Certificate was added to keystore