如何在 C#/Xamarin 中使用带有来自 android 钥匙串的私钥的 X.509 证书?

How can I use an X.509 certificate with private key from the android keychain in C#/Xamarin?

我正在构建一个应该从 Android 钥匙串加载 X.509 证书和 RSA public 密钥的 Xamarin 应用程序。我想将它们转换为 X509Certificate2 的实例(System.Security.Cryptography.X509Certificates.X509Certificate2),但我真的不知道如何这样做。

我能够访问证书链(java.security.cert.X509Certificate[])和私钥(java.security.IPrivateKey),但我无法将它们组合成 X509Certificate2。我找到了 this 旧线程,作者在其中遇到了类似的问题,但他的问题并没有真正的解决方案。

这是他使用的代码(自 Android 4.1 以来不再有效。另外,我不知道他使用的是哪个 PKCS8 class,因为 Mono.Security.Cryptography.PKCS8 不是 public):

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() returns null,所以我不能使用这种方式,因此不知道如何将私钥放入 certificate.

所以,问题是:如何使用钥匙串创建 X509Certificate2 API?

提前致谢。

简短的回答是你不能。 这是因为私钥存储在硬件中,并且从 Android 4.1 开始,您的应用程序无法访问,这就是为什么它 returns 为空。 Here's an article 如果您想阅读更多内容。