[РЕШЕНО] WebGL + WSS

Общие вопросы о Unity3D

[РЕШЕНО] WebGL + WSS

Сообщение Saltant 25 авг 2021, 20:48

Проблемка встала внезапно, юзаю для webGl игры сеть MLAPI + Websocket transport, принцип кодинга сети примерно как в старом UNET, но не в этом дело.
Собираю серверный билд на юнити, указываю старт вебсокета на localhost и порт 5666, запускаю в дебаге сервер стартует, в системе вижу что порт прослушивается. Запускаю как WSS и указываю путь к pks сертификату + пароль.

Собираю WebGL клиент, в клиентском вебсокете для соединения указываю домен сайта и хаб где живет вебсокет. (https://domen.ru/wshub) (пусть будет domen.ru для текста).
Веб сервер собственный на своей машине, трафик проксируется через Cloudflare, на сервере стоит Apache2 (v. 2.4.29).
В виртуал хосте написано следующее:

Синтаксис:
Используется bash
<IfModule mod_ssl.c>
<VirtualHost *:443>
  ServerName domen.ru

  RewriteEngine On
  ProxyPreserveHost On
  ProxyRequests Off

  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule ^/(wshub)$           wss://localhost:5666/$1 [P,L]

  ProxyPass "/" "http://localhost:5050/"
  ProxyPassReverse "/" "http://localhost:5050/"

  ErrorLog /var/log/apache2/xxx-release-error.log
  CustomLog /var/log/apache2/xxx-release-access.log common

  SSLCertificateFile /var/www/xxx/certs/cert.pem
  SSLCertificateKeyFile /var/www/xxx/certs/privatekey.key

</VirtualHost>
</IfModule>
 


Если правильно понимаю задумку, то при попытке клиента присоединиться к сокету по wss://domen.ru/wshub апач должен проксировать соединение на серверный билд юнити на моей машине который слушает порт 5666. Весь остальной трафик гнать на localhost:5050 где у меня собсна сам сайт который запускает клиентский билд юнити.

Но короче нифига так не работает, файрфокс пишет ошибку при попытке сокета присоединиться "Firefox не может установить соединение с сервером wss://domen.ru/wshub.
В клаудфлейре включена поддержка вебсокета, если это важно.

Как заставить всю эту кодлу работать? Третий день мозги трахаю.
Если пробовать подрубать сокет по WS а не WSS и сервер запускать на WS - то все коннектится нормально, но мне такое не подходит ибо сайт должен работать на https а микшировать соединения, безопасное с открытым - браузеры не дают.
Последний раз редактировалось Saltant 26 авг 2021, 01:31, всего редактировалось 1 раз.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: WebGL + WSS

Сообщение DbIMok 25 авг 2021, 21:37

непонятно каким боком это к localhost
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: WebGL + WSS

Сообщение Saltant 25 авг 2021, 22:25

DbIMok писал(а):непонятно каким боком это к localhost

А что не понятного? сайт там же где и вебсокет, на одной машине. Соответственно апач проксирует внутри одного железного сервера.

При загрузки сайта он все же проксирует куда нужно, на wss сокет, только файрфокс отваливается с ошибкой 500, что не может соединиться а в консоле WSS сервера пишется непонятная шняга:
Синтаксис:
Используется text
8/25/2021 10:27:55 PM|Error|<>c__DisplayClass71_0.<receiveRequest>b__0|One or more errors occurred.


Вероятно как то сам websocket сервер не верно сконфигурирован? Какие есть мысли по этому поводу.

UPD:
Поправил сорцы вебсокет сервера, удалось выдернуть стактрейс.
Скрытый текст:
Синтаксис:
Используется text
Exception: One or more errors occurred.
StackTrace:   at System.Threading.Tasks.Task.ThrowIfExceptional &#40;System.Boolean includeTaskCanceledExcepti                                                    ons&#41; [0x00011] in <695d1cc93cca45069c528c15c9fdd749>:0
  at System.Threading.Tasks.Task.Wait &#40;System.Int32 millisecondsTimeout, System.Threading.CancellationToke                                                    n cancellationToken&#41; [0x00043] in <695d1cc93cca45069c528c15c9fdd749>:0
  at System.Threading.Tasks.Task.Wait &#40;&#41; [0x00000] in <695d1cc93cca45069c528c15c9fdd749>:0
  at Mono.Net.Security.MobileAuthenticatedStream.AuthenticateAsServer &#40;System.Security.Cryptography.X509Ce                                                    rtificates.X509Certificate serverCertificate, System.Boolean clientCertificateRequired, System.Security.Au                                                    thentication.SslProtocols enabledSslProtocols, System.Boolean checkCertificateRevocation&#41; [0x00011] in <b5                                                    226d7672da4aeaa36d32bf1166a63b>:0
  at System.Net.Security.SslStream.AuthenticateAsServer &#40;System.Security.Cryptography.X509Certificates.X50                                                    9Certificate serverCertificate, System.Boolean clientCertificateRequired, System.Security.Authentication.S                                                    slProtocols enabledSslProtocols, System.Boolean checkCertificateRevocation&#41; [0x00006] in <b5226d7672da4aea                                                    a36d32bf1166a63b>:0
  at WebSocketSharp.Net.WebSockets.TcpListenerWebSocketContext..ctor &#40;System.Net.Sockets.TcpClient tcpClie                                                    nt, System.String protocol, System.Boolean secure, WebSocketSharp.Net.ServerSslConfiguration sslConfig, We                                                    bSocketSharp.Logger log&#41; [0x00052] in <2375f7c2dc88414790edfe07f015c664>:0
  at WebSocketSharp.Server.WebSocketServer+<>c__DisplayClass71_0.<receiveRequest>b__0 &#40;System.Object state                                                    &#41; [0x00000] in <2375f7c2dc88414790edfe07f015c664>:0
InnerException: Failed to create UnityTls context - error code: UNITYTLS_INVALID_ARGUMENT
InnerException StackTrace:   at Mono.Unity.Debug.CheckAndThrow &#40;Mono.Unity.UnityTls+unitytls_errorstate er                                                    rorState, System.String context, Mono.Security.Interface.AlertDescription defaultAlert&#41; [0x00027] in <b522                                                    6d7672da4aeaa36d32bf1166a63b>:0
  at Mono.Unity.UnityTlsContext..ctor &#40;Mono.Net.Security.MobileAuthenticatedStream parent, System.Boolean                                                     serverMode, System.String targetHost, System.Security.Authentication.SslProtocols enabledProtocols, System                                                    .Security.Cryptography.X509Certificates.X509Certificate serverCertificate, System.Security.Cryptography.X5                                                    09Certificates.X509CertificateCollection clientCertificates, System.Boolean askForClientCert&#41; [0x0029e] in                                                     <b5226d7672da4aeaa36d32bf1166a63b>:0
  at Mono.Unity.UnityTlsStream.CreateContext &#40;System.Boolean serverMode, System.String targetHost, System.                                                    Security.Authentication.SslProtocols enabledProtocols, System.Security.Cryptography.X509Certificates.X509C                                                    ertificate serverCertificate, System.Security.Cryptography.X509Certificates.X509CertificateCollection clie                                                    ntCertificates, System.Boolean askForClientCert&#41; [0x00000] in <b5226d7672da4aeaa36d32bf1166a63b>:0
  at Mono.Net.Security.MobileAuthenticatedStream+<ProcessAuthentication>d__47.MoveNext &#40;&#41; [0x00121] in <b5                                                    226d7672da4aeaa36d32bf1166a63b>:0

Failed to create UnityTls context - error code: UNITYTLS_INVALID_ARGUMENT - Видимо из за этой шняги ничо не работает. Теперь понять нужно что это такое и как починить.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: WebGL + WSS

Сообщение Saltant 26 авг 2021, 01:31

Методом глубокого дебагинга исходников вебсокета, выявил все проблемы, пофиксил и теперь всё спокойно коннектится по WSS через прокси апача.

Кому интересны проблемы, вот какие были:
Первая, которая как раз и выдавала ошибку Tls, на вебсокет сервере нужно указать какой протокол безопасности юзать, по дефолту стоял None, я поменял на WebSocketServer.SslConfiguration.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12;.
Вторая, заключалась в том, что сервер обрывал соединения если они шли с перенаправленного запроса (а я как раз юзаю реверс прокси, видимо это важно), в итоге указал серверу чтоб принимал перенаправленные запросы AllowForwardedRequest = true;
После этих манипуляций вебсокет на wss начал принимать защищенные соединения.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 10