2015-08-11 3 views
4

В настоящее время я пытаюсь собрать действующую реализацию KeyStore в приложении для Android. В настоящее время я строю против минимального API, равного 18, чтобы я мог полностью воспользоваться приватным KeyStore для моего приложения. Я пытаюсь создать n номер KeyPair объектов, а также сохранить их в KeyStore для последующего поиска. Я посмотрел на this question, однако он кажется немного устаревшим (2012) и на самом деле ничего не отвечает на все. Честно говоря, большинство вопросов, которые я нашел в Stack Overflow, кажется невероятно устаревшими, например here и here.Система Android KeyStore - Сохранение KeyPair?

Таким образом, мой предполагаемый поток заключается в следующем:

  1. Попытка получить открытый ключ из сертификата correllating с соответствующим псевдонимом.
  2. В случае, если этот открытый ключ равен NULL, создайте новый ключ.
  3. Включить KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
  4. Создать пару ключей.

Все до этого момента очень прямолинейно и работает отлично. Затем он становится волосатым.

  1. Сохраните пару ключей. Инициализировать KeyStore через KeyStore.getInstance("AndroidKeyStore");
  2. Попытка создать X509Certificate через X509V3CertificateGenerator. Этот сертификат подписан сам. Для cert я установил алгоритм подписи как "SHA1WithRSAEncryption".
  3. Наконец, вызовите keyStore.setKeyEntry

Для этого последнего шага кажется, есть два варианта:

keyStore.setKeyEntry(String alias, byte[] key, Certificate[] chain);

или

keyStore.setKeyEntry(String alias, Key key, char[] password, Certificate[] chain);

я начал со второй из два, но получил java.security.KeyStoreException: entries cannot be protected with passwords .... Ладно, это странно, почему существует метод, который гарантирует исключение? Давайте попробуем номер двери 1.

В какой момент, когда я вызываю setKeyEntry и передаю keyPair.getPrivate(). GetEncoded() как второй аргумент, я получаю java.security.KeyStoreException: Operation not supported because key encoding is unknown из системы.

Так что я немного растерялся. Такое шифрование относительно новое для меня, поэтому я надеялся, что кто-то может пролить свет на очень запутанную ситуацию, которая является системой Android KeyStore.

ответ

11

Итак, я нашел ответ - надеюсь, это поможет сохранить некоторые проблемы для будущих пользователей, поскольку это не ясно изложено в документах.

KeyPairGeneratorSpec.Builder имеет способ setAlias. Когда генерируется ключ, он автоматически сохраняется в KeyStore под этим псевдонимом. нет никакой дополнительной экономии, которая должна произойти, чтобы заставить ее работать. Затем вы можете легко получить эти ключи, создав экземпляр KeyStore с тем же String provider, что и KeyPairGenerator.

2

Я пытался импортировать файл PKCS12 (скажем, загруженный пользователем вручную) в AndroidKeyStore. Кажется, что

keyStore.setKeyEntry(String alias, byte[] key, Certificate[] chain); 

не реализуется AndroidKeyStore и он всегда выдает следующее исключение:

KeyStoreException("Operation not supported because key encoding is unknown") 

Ref: https://android.googlesource.com/platform/frameworks/base.git/+/android-5.1.1_r19/keystore/java/android/security/AndroidKeyStore.java

@Override 
    public void engineSetKeyEntry(String alias, byte[] userKey, Certificate[] chain) 
      throws KeyStoreException { 
     throw new KeyStoreException("Operation not supported because key encoding is unknown"); 
    } 

Итак, я попытался с помощью

keyStore.setKeyEntry(String alias, Key key, char[] password, Certificate[] chain); 

путем передачи пароля как null. Это сработало для меня.

 Смежные вопросы

  • Нет связанных вопросов^_^