Xamarin iOS SslStream.AuthenticateAsUser() returns 异常 "Unknown Secure Transport error `PeerHandshakeFail'."

Xamarin iOS SslStream.AuthenticateAsUser() returns exception "Unknown Secure Transport error `PeerHandshakeFail'."

我正在开发一个 Xamarin 应用程序,我正在其中建立与服务器的连接。服务器代码目前对我来说是一个黑匣子,我只有文档。

但是,由于服务器切换到 TLS1.2,我正在尝试使用 .NET 的 SslStream 在我的应用程序上进行身份验证。我确保两者都使用相同的证书。 证书是自签名的

每当我尝试执行 AuthenticateAsClient 时,我都会收到以下异常:

Mono.Security.Interface.TlsException: Unknown Secure Transport error `PeerHandshakeFail'.

这是我的部分代码:

using (var stream = new SslStream(new NetworkStream(mainSocket), false, new RemoteCertificateValidationCallback(ValidateServerCertificate)))
{
   try
   {
       stream.AuthenticateAsClient(ServerIpAdressServer, GetX509CertificateCollection(), System.Security.Authentication.SslProtocols.Tls12, false);
   }
   catch (Exception e)
   {
       Console.WriteLine(e);
   }
}

(ValidateServerCertificate 总是 returns true)

这是我获取证书的方法:

public static X509CertificateCollection GetX509CertificateCollection()
{
    var assembly = IntrospectionExtensions.GetTypeInfo(typeof(MyClass)).Assembly;
    X509CertificateCollection collection1;
    using (MemoryStream ms = new MemoryStream())
    {
        assembly.GetManifestResourceStream("namespace.cert.pem").CopyTo(ms);
        X509Certificate2 certificate1 = new X509Certificate2(ms.ToArray());
        collection1 = new X509CertificateCollection();
        collection1.Add(certificate1);
    }
    return collection1;
}

提前致谢!

这是 document 中有关 Xamarin 中 TLS1.2 的警告 IOS.May 对您有所帮助。

the downside is that it requires the event loop to be running for async operations to be executed.

SslStream.AuthenticateAsClientAsync Method : 将 client-server 连接的客户端验证为异步操作。

因此,从您使用异步方法进行的测试来看,这是正确的解决方案。很高兴解决了。