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

Posted

技术标签:

【中文标题】如何在 C#/Xamarin 中使用带有来自 android 钥匙串的私钥的 X.509 证书?【英文标题】:How can I use an X.509 certificate with private key from the android keychain in C#/Xamarin? 【发布时间】:2020-03-07 11:59:42 【问题描述】:

我正在构建一个 Xamarin 应用程序,它应该从 android 钥匙串加载 X.509 证书和 RSA 公钥。我想将它们转换为 X509Certificate2 (System.Security.Cryptography.X509Certificates.X509Certificate2) 的实例,但我真的不知道该怎么做。 p>

我能够访问证书链 (java.security.cert.X509Certificate[]) 和私钥 (java.security.IPrivateKey),但我可以'不要将它们组合成一个X509Certificate2。我找到了this old thread,作者遇到了类似的问题,但他的问题并没有真正的解决方案。

这是他使用的代码(自 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,所以我不能使用这种方式,因此不知道如何获取私钥进入证书

那么,问题是:如何使用 KeyChain API 创建 X509Certificate2?

提前致谢。

【问题讨论】:

【参考方案1】:

简短的回答是你不能。 这是因为私钥存储在硬件中,并且从 Android 4.1 开始,您的应用程序无法访问,这就是它返回 null 的原因。 Here's an article 如果您想了解更多信息。

【讨论】:

该死的。我几乎预料到了这一点,但感谢您的确认。

以上是关于如何在 C#/Xamarin 中使用带有来自 android 钥匙串的私钥的 X.509 证书?的主要内容,如果未能解决你的问题,请参考以下文章

在 Xamarin Forms 中下载带有进度条的文件

如何在消息框中显示来自 C# 的带有 WCHAR* 的 C 函数

来自 ios 中的 Visual Studio xamarin 的 Web 服务调用

在 c# Xamarin 中等待带有弹出窗口的任务

如何使用带有 Xamarin 的 AudioUnit 录制音频

Xamarin Android 保留来自 Linking 的方法