SSL/TLS в Unity
А сегодня мы будем шифровать весь трафик. А зачем? А чтобы усложнить жизнь читерам.
Если у вас мультиплеер на авторитарном сервере, естественно все действия должны контролироваться на нем. Но зная, какие команды отправлять, можно легко написать бота, который автоматизирует некоторые процессы, нарушая баланс и игру «правильных» игроков. Конечно, если сильно захотеть, можно сломать все что угодно, но усложнить жизнь взломщикам и читерам тоже можно. Будем использовать SSL.
Ничего изобретать не буду, потому что «все уже придумано до нас» :)
Для теста серверной части (на node.js) и генерации ключей используем эти скрипты. Единственное, чего там нет — это как из сертификата и ключа сделать PFX файл:
openssl pkcs12 -export -in client.crt -inkey client.key -out mycert.pfx
Этот файл понадобится для клиента. Для проверки SSL соединения берем пример с сокетами с MSDN и немного переделываем его. Получаем поток и прокидываем его через SSL.
IEnumerator UseSSL () {
NetworkStream stream = new NetworkStream (socket);
SslStream sslStream = new SslStream (stream, false, new RemoteCertificateValidationCallback (CertificateValidationCallback), new LocalCertificateSelectionCallback (CertificateSelectionCallback));
bool authenticationPassed = true;
#if UNITY_EDITOR
X509Certificate2 cert = new X509Certificate2(certPath, certPassword);
#elif UNITY_ANDROID || UNITY_IOS
WWW reader = new WWW (certPath);
while (!reader.isDone)
yield return null;
X509Certificate2 cert = new X509Certificate2 (reader.bytes, certPassword);
#endif
X509Certificate2Collection certs = new X509Certificate2Collection();
certs.Add (cert);
sslStream.AuthenticateAsClient (server, certs, SslProtocols.Tls, true);
authenticationPassed = sslStream.IsAuthenticated;
if (authenticationPassed) {
///
}
yield break;
}
Вот и весь квест. Теперь трафик между игровым сервером и клиентом зашифрован.
Privjet! Sorry for not speaking russian, but what TLS version is this using? 1.2?
Hi there! Check the demo, it was made with default settings.
Вы храните пароль от серта в клиенте . вы ни чего не проверяете в CertificateValidationCallback и возращаете true
Вы уверены что ваш трафик защищен?
Ну во-первых, это упрощенный пример, а во-вторых, сломать можно все что угодно, было бы желание.