0

我是 RSA 的新手。我已经使 Windows 和 Xamarin.Android 客户端应用程序与 ASP.NET MVC .NET 4.7.2 应用程序很好地通信。一切正常。客户端应用程序可以与服务器共享他们的公钥,服务器可以与客户端应用程序做同样的事情。

现在我在 Xamarin.iOS 中实施解决方案,并按照本教程创建密钥对:https ://msicc.net/how-to-perform-asymmetric-encryption-without-user-input-hardcoded-values-with- xamarin-ios/

我的问题是将公钥导出到服务器。服务器无法识别公钥。

我的 C# 代码在 Xamarin.iOS 中进行了导出:

            var cert = this.publicKey.GetExternalRepresentation();
            var publicKeyBytes = new byte[cert.Length];
            System.Runtime.InteropServices.Marshal.Copy(cert.Bytes, publicKeyBytes, 0, Convert.ToInt32(cert.Length));
            return Convert.ToBase64String(publicKeyBytes, Base64FormattingOptions.InsertLineBreaks);

在服务器端,有我的 c# 代码:

        var bytes = Convert.FromBase64String(cer);
        X509Certificate2 cert = new X509Certificate2(bytes);
        this.rsaDistant = cert.GetRSAPublicKey();

我花了很长时间查看帖子,并在 swift、objectif c 中看到了许多示例。似乎 iOS 没有导出为 X.509 格式。我还看到微软在 Xamarin.iOS 中制作了像 SecCertificate 和 SecCertificate2 这样的类,可以导出 X.509 证书,但是当我使用它时,调试器在导出时冻结。

我怎样才能实现我的目标?你已经用 Xamarin.iOS 成功了吗?

谢谢您的帮助 !

4

1 回答 1

0

您是否查看了苹果文档:存储 DER 编码的 X.509 证书

这是一个使用的工作示例SecCertificate,请检查下面的代码。

var path = Directory.GetParent(GlobaleObjekte.SSLZertifikatePath);
var caPath = Path.Combine(path.FullName, "ca.cert.der");
var caByteArray = File.ReadAllBytes(caPath);
var caCert = new SecCertificate(caByteArray);

var interPath = Path.Combine(path.FullName, "intermediate.cert.der");
var interByteArray = File.ReadAllBytes(interPath);
var interCert = new SecCertificate(interByteArray);

var clientPath = Path.Combine(path.FullName, "client.pfx");
var clientByteArray = File.ReadAllBytes(clientPath);
var clientCert = new X509Certificate2(clientByteArray, Settings.WSClientCertPasswort);

var identity = SecIdentity.Import(clientCert);
var credential = new NSUrlCredential(identity, new SecCertificate[] { caCert, interCert }, NSUrlCredentialPersistence.ForSession);

completionHandler(NSUrlSessionAuthChallengeDisposition.UseCredential, credential);
于 2021-05-27T09:50:02.377 回答