Java 如何在C#/Xamarin中使用带有android密钥链私钥的X.509证书?

Java 如何在C#/Xamarin中使用带有android密钥链私钥的X.509证书?,java,c#,xamarin,xamarin.android,android-keystore,Java,C#,Xamarin,Xamarin.android,Android Keystore,我正在构建一个Xamarin应用程序,它应该从Android密钥链加载X.509证书和RSA公钥。我想将它们转换为X509Certificate2(System.Security.Cryptography.X509Certificates.X509Certificate2)的一个实例,但我真的不知道怎么做 我能够访问证书链(java.security.cert.X509Certificate[])和私钥(java.security.IPrivateKey),但我不能将它们组合到X509Certi

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

我能够访问证书链(java.security.cert.X509Certificate[])和私钥(java.security.IPrivateKey),但我不能将它们组合到X509Certificate2。我找到了旧的线程,在那里作者有一个类似的问题,但没有真正解决他的问题

这是他使用的代码(自Android 4.1以来不再工作。此外,我不知道他使用的是哪个PKCS8类,因为Mono.Security.Cryptography.PKCS8不是公共的):

从Android 4.1开始,privKey.GetEncoded()返回null,因此我不能使用这种方法,因此不知道如何将私钥放入证书中

所以,问题是:如何使用keychainAPI创建X509Certificate2


提前谢谢。

简单的回答是你不能。 这是因为私钥存储在硬件中,来自Android 4.1,应用程序无法访问,这就是它返回null的原因。
以防你想多读一些。

该死。我差点就想到了,不过谢谢你的确认。
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;