Как создать доступные PrivateKeys? - PullRequest
0 голосов
/ 12 февраля 2019

Я наткнулся на следующую проблему:

Мне нужно создать KeyPair , где мне нужно один раз получить доступ к PrivateKey * getEncoded(), прежде чемвставка его в AndroidKeyStore.

. При генерации ключа с помощью AndroidKeyStore полученный метод Keys getEncoded() возвращает null (как предполагается, в качестве дополнительного механизма защиты ключа).

Вот как я генерирую ключ, используя KeyGenParameterSpec (нацеленный только на устройства выше Android.M):

public AlgorithmParameterSpec createSpec(){

    Calendar start = new GregorianCalendar();
    Calendar end = new GregorianCalendar();
    end.add(Calendar.YEAR, 1);
    String alias = "myKeyAlias";

    AlgorithmParameterSpec spec = new KeyGenParameterSpec.Builder(alias,
    KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY | 
    KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                    .setCertificateSubject(new X500Principal("CN=" + alias))
                    .setDigests(KeyProperties.DIGEST_SHA256)
                    .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                    .setCertificateSerialNumber(BigInteger.valueOf(1337))
                    .setCertificateNotBefore(start.getTime())
                    .setCertificateNotAfter(end.getTime())
                    .build();
   return spec;
}

public KeyPair generateKeyPairInKeystore(AlgorithmParameterSpec spec){
    KeyPairGenerator kpGenerator = KeyPairGenerator
            .getInstance("RSA", "AndroidKeyStore");
    kpGenerator.initialize(spec);

    KeyPair kp = kpGenerator.generateKeyPair();
    //here kp.getPrivate().getEncrypted() doesn't give me the key
    return kp;
}

public KeyPair generateKeyPair(AlgorithmParameterSpec spec){
    KeyPairGenerator kpGenerator = KeyPairGenerator
            .getInstance(SecurityConstants.TYPE_RSA);
    kpGenerator.initialize(spec);

    KeyPair kp = kpGenerator.generateKeyPair();
    //I cannot receive the encrypted Key here either
    //kp.getPrivate().getEncrypted();
    return kp;
}

Эти ключи генерируются внутри AndroidKeyStore, поэтому они автоматически сохраняются там.Но я не могу получить доступ к getEncrypted(), чтобы отправить его на доверенный сервер.

Так что мне не хватает:

  1. Как создать PrivateKey, где getEncoded()доступно?
  2. Как хранить его в защищенном Android KeyStore (как мне нужно предоставить сертификаты вместе)?
...