Как я могу использовать сертификат X.509 с закрытым ключом из цепочки для ключей Android в C#/Xamarin?

Я создаю приложение Xamarin, которое должно загружать сертификаты X.509 и открытые ключи RSA из цепочки для ключей Android. Я хочу преобразовать их в экземпляр X509Certificate2 (System.Security.Cryptography.X509Certificates.X509Certificate2), но не знаю, как это сделать.

Мне удалось получить доступ как к цепочке сертификатов (java.security.cert.X509Certificate[]), так и к закрытому ключу (java.security.IPrivateKey), но я не могу объединить их в X509Certificate2. Я нашел эта старая ветка, в которой у автора была похожая проблема, но не было решения для его проблемы.

Это код, который он использовал (больше не работает с Android 4.1. Кроме того, я не знаю, какой класс PKCS8 он использовал, так как Mono.Security.Cryptography.PKCS8 не является общедоступным):

X509Certificate[] certChain = KeyChain.GetCertificateChain(ctx, Alias);
IPrivateKey privKey = KeyChain.GetPrivateKey(ctx, Alias);

KeyStore pkcs12KeyStore = KeyStore.GetInstance("PKCS12");
pkcs12KeyStore.Load(null, null);
pkcs12KeyStore.SetKeyEntry(Alias, privKey, null, certChain);

X509Certificate javaCertificate = (X509Certificate) pkcs12KeyStore.GetCertificate(Alias);

PKCS8.PrivateKeyInfo privateKeyInfo = new PKCS8.PrivateKeyInfo(privKey.GetEncoded());
RSA privatekeyRsa = PKCS8.PrivateKeyInfo.DecodeRSA(privateKeyInfo.PrivateKey);

X509Certificate2 certificate = new X509Certificate2(javaCertificate.GetEncoded());
certificate.PrivateKey = privatekeyRsa;

Начиная с Android 4.1, privKey.GetEncoded() возвращает null, поэтому я не могу использовать этот способ и поэтому не знаю, как получить закрытый ключ в сертификат.

Итак, вопрос: как я могу создать X509Certificate2 с API KeyChain?

Заранее спасибо.


person anonymus1994.1    schedule 11.11.2019    source источник


Ответы (1)


Короткий ответ: вы не можете. Это связано с тем, что закрытый ключ хранится в аппаратном обеспечении и из Android 4.1 недоступен для вашего приложения, поэтому он возвращает значение null. Вот статья на случай, если вы захотите узнать об этом подробнее.

person Saamer    schedule 15.11.2019
comment
Блин. Я почти ожидал этого, но спасибо за подтверждение. - person anonymus1994.1; 17.11.2019