如何在 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 证书?的主要内容,如果未能解决你的问题,请参考以下文章
如何在消息框中显示来自 C# 的带有 WCHAR* 的 C 函数
来自 ios 中的 Visual Studio xamarin 的 Web 服务调用