Xamarin iOS SslStream.AuthenticateAsUser () возвращает исключение «Неизвестная ошибка безопасного транспорта« PeerHandshakeFail ».» - PullRequest
0 голосов
/ 09 июля 2019

Я работаю над приложением Xamarin, в котором я устанавливаю соединение с сервером.Код сервера в настоящее время для меня черный ящик, у меня есть только документация.

Однако, поскольку сервер переключился на TLS1.2, я пытаюсь использовать SslStream .NET для аутентификации в моем приложении.Я убедился, что оба используют один и тот же сертификат. сертификат является самоподписанным .

Всякий раз, когда я пытаюсь сделать 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 всегда возвращает 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;
}

Заранее спасибо!

1 Ответ

1 голос
/ 10 июля 2019

Вот предупреждение в документе о TLS1.2 в Xamarin IOS. Может быть полезно для вас.

недостатком является то, что для запуска цикла обработки событий требуетсядля выполнения асинхронных операций.

Метод SslStream.AuthenticateAsClientAsync : проверка подлинности на стороне клиента клиент-серверного соединения как асинхронной операции.

Ваше тестирование с помощью асинхронного метода, это правильное решение.Рад, что решил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...