SignalR в kubernetes с входным сервисом Let’s Encrypt

У меня есть приложение dotnet core signalR для сервисов kubernetes. Вдобавок ко всему, давайте зашифруем входной сервис, который предоставит мне SSL-сертификат.

Я могу получить веб-сайт под сертификатом Let's encrypt, и все кажется действительным.

Если я хочу подключить signalR по протоколу wss, каждые 2 секунды соединение сбрасывается.

Ошибка:

{"error":"Handshake was canceled."}
The connection was terminated cleanly with status code 1000 (NORMAL).

Лог сервера такой:

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://DOMAIN/ChatHub  
dbug: Microsoft.AspNetCore.Http.Connections.Internal.HttpConnectionManager[1]
      New connection XPqUHoK9b4PAeF_bKwQtIg created.
dbug: Microsoft.AspNetCore.Http.Connections.Internal.HttpConnectionDispatcher[4]
      Establishing new connection.
dbug: Microsoft.AspNetCore.SignalR.HubConnectionHandler[5]
      OnConnectedAsync started.
dbug: Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport[1]
      Socket opened using Sub-Protocol: '(null)'.
dbug: Microsoft.AspNetCore.SignalR.HubConnectionContext[2]
      Handshake was canceled.
dbug: Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport[7]
      Waiting for the client to close the socket.
dbug: Microsoft.AspNetCore.Http.Connections.Internal.Transports.WebSocketsTransport[2]
      Socket closed.
dbug: Microsoft.AspNetCore.Http.Connections.Internal.HttpConnectionManager[2]
      Removing connection XPqUHoK9b4PAeF_bKwQtIg from the list of connections.

Версии приложений:

netcoreapp2.2
Microsoft.AspNet.SignalR -v 2.4.0

Я пробовал также чистые соединения через веб-сокет, но это было то же самое. Как я могу решить эту проблему?

PS: Это сработало, если бы я определил физический SSL-сертификат для сервера пустельги.


person Mert Demir    schedule 23.01.2019    source источник


Ответы (1)


У меня была похожая проблема, и вот как я с ней справился. Примечание: это решение является рабочим решением для чистого веб-сокета в ядре dotnet 2.2. Я не тестировал его с помощью signalR.

использовать Apache в качестве прокси Microsoft doc здесь

<IfModule mod_ssl.c>
<VirtualHost *:443>
  ProxyPreserveHost On
  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule /(.*)           ws://127.0.0.1:81/$1 [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket [NC]
  RewriteRule /(.*)           http://127.0.0.1:81/$1 [P,L]

    ProxyPass / http://127.0.0.1:81/
    ProxyPassReverse / http://127.0.0.1:81/
</VirtualHost>
</IfModule>

так что в основном произойдет то, что трафик будет HTTPS до Apache, а затем Apache будет действовать как прокси и передавать трафик Kestrel. это может показаться сложным в настройке, но это не так, - настройте Apache для работы с HTTP и WS, затем настройте let's encrypt следующим образом:

sudo add-apt-repository ppa:certbot/certbot
sudo apt install python-certbot-apache
sudo nano /etc/apache2/sites-available/example.com.conf
...
ServerName example.com;
...
sudo apache2ctl configtest
sudo systemctl reload apache2
sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'

следующая строка команды настроит вашу конфигурацию SSL Apache

sudo certbot --apache -d example.com -d www.example.com

тогда вы сможете получить доступ к своему сайту через HTTPS и WSS, до сих пор это никогда не подводило :)

person Ali Alp    schedule 14.03.2019