Я наткнулся на следующую проблему:
Мне нужно создать 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()
, чтобы отправить его на доверенный сервер.
Так что мне не хватает:
- Как создать
PrivateKey
, где getEncoded()
доступно? - Как хранить его в защищенном Android
KeyStore
(как мне нужно предоставить сертификаты вместе)?