如何在 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 如果您想阅读更多内容。
我正在构建一个应该从 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 如果您想阅读更多内容。