Я пытаюсь обновить TcpClient
моего приложения, чтобы использовать TLS с SslStream
вместо обычного Stream
, код, который я использую для этого, кажется, работает за пределами Unity, но не работает, когда интегрируется в мой Проект Unity 2019.1.8 (протестирован также на 2018 и 2017).
Чтобы установить sh соединение и открыть новый SslStream
Я использую следующий код:
public static void InitClient(string hostName, int port, string certificateName)
{
client = new TcpClient(hostName, port);
if (client.Client.Connected)
{
Debug.LogFormat("Client connected succesfully");
}
else
{
Debug.LogErrorFormat("Client couldn't connect");
return;
}
stream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
try
{
stream.AuthenticateAsClient(certificateName);
}
catch (AuthenticationException e)
{
Debug.LogErrorFormat("Error authenticating: {0}", e);
if (e.InnerException != null)
{
Debug.LogErrorFormat("Inner exception: {0}", e);
}
Debug.LogErrorFormat("Authentication failed - closing connection");
stream.Close();
client.Close();
}
}
И для проверки сертификата
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
Debug.LogErrorFormat("Certificate error: {0}", sslPolicyErrors);
return false;
}
В Unity 2019.1.8 клиент подключается и попытается проверить удаленный сертификат, который завершается неудачно с ошибкой TlsException: Handshake failed - error code: UNITYTLS_INTERNAL_ERROR, verify result: UNITYTLS_X509VERIFY_FLAG_NOT_TRUSTED.
Создание ValidateServerCertificate
всегда return true
позволяет моему клиенту подключаться без проблем.
Я попытался воспроизвести проблему в автономном C# нацеливании на консольное приложение. net framework 4.7.1, используя точно такой же код. Запуск клиента в этом приложении вернет true
из ValidateServerCertificate
из проверки sslPolicyErrors == SslPolicyErrors.None
.
Я знаю, что сертификат является действительным сертификатом, выданным доверенным центром сертификации (что подтверждается тем фактом, что сертификат принят из консольного приложения и имеет замок в браузерах).
Почему проверка не проходит в Unity, но нигде больше?