Страницы

Поиск по вопросам

вторник, 12 февраля 2019 г.

Сертификат для KeyStore

Создаю хранилище для PrivateKey. В строке KeyStore.PrivateKeyEntry skEntry = new KeyStore.PrivateKeyEntry() в функцию PrivateKeyEntry() необходимо передать 2 параметра один из которых сам приватный ключ, а второй параметр это сертификат. Я не совсем понимаю как этот сертификат получить имея открытый и закрытый ключ. Весь кусок кода(строку в которой проблема выделил):
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(4096, new SecureRandom()); final KeyPair key = keyGen.generateKeyPair(); KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType()); KeyStore.ProtectionParameter protParam = new KeyStore.PasswordProtection(password.getText().toString().toCharArray());
KeyStore.PrivateKeyEntry skEntry = new KeyStore.PrivateKeyEntry(?????????)
store.setEntry(nickname.getText().toString(), skEntry, protParam);


Ответ

Судя по вопросу вы не совсем понимаете основную проблему публичной криптографии. Главная ее проблема состоит в том, чтобы удостовериться, что публичный ключ принадлежит тому кто ее предъявляет.
Это аналогично тому, что человек приходит с ключом от квартиры, где бабки лежат и надо теперь удостовериться что это его квартира. В обычной жизни с такого человека затребуют документ подтверждающий что квартира принадлежит ему или по крайней мере он имеет какое-то отношение к ней (например договор аренды).
Точно такую же роль этого удостоверяющего документа в публичной криптографии имеет цифровой сертификат. В реале цифровые сертификаты генерируют доверенные центры, типа VeriSign, Thawte и проч. Их подписи распознаются нормальными браузерами и устройствами, поскольку они могут сверить слепок подписи (fingerprint) со слепками, которые хранятся в устройствах. Для интереса зайдите в своем Android устройстве в раздел Сертификаты безопасности - в настройках девайса или в любом настольном браузере в настройках, типа:
.
Вообще-то сертификация ключа стоит и денег и времени.
В вашем случае, вы сами генерируете на лету пару ключей и поэтому не сможете предъявить нормальный сертификат. На этот случай предусмотрена генерация т.н. Self Signed Certificate, то есть сертификата, который вы сами же и подписали своим же ключом. Возвращаясь к нашему примеру с квартирой, это аналог того, что - предъявитель ключа пишет расписку, типа: да, я имярек, мамой клянусь, что это моя квартира :)
Теперь ближе к делу. Вам надо cгенерировать т.н. SelfSigned сертификат стандарта X.509. Но здесь начинаются проблемы. Реализация класса X509Certificate из коробки подразумевает его создания только из битового массива или из InputStream, Selfsign реализован, но почему-то скрыт от широкой общественности. Подробнее об этом здесь
К счастью есть такая либа как Bouncy Castle, в котором это можно относительно легко сделать.
Но опять же к несчастью, напрямую использовать Bouncy Castle в Android нельзя так как Google по неизвестным причинам его уже использует в коде Android, но в каком то урезанном виде, так что 90% Bouncy Castle неработоспособны. То есть при попытке включить библиотеку Bouncy Castle в ваш код, будет выдана ошибка о задвоении.
Опять же к счастью (мир не без добрых людей) - умные люди написали Spongy Castle - специальный порт Bouncy Castle для Android'а который избавлен от конфликта имен.
Ну вот теперь:
Импортируем Spongy Castle через Gradle Читаем как генерировать сертификат
P.S. Уффф... зачем я так много написал? Наверное в честь пятницы

Комментариев нет:

Отправить комментарий