【问题标题】:SignalR on kubernetes with let's encrypt ingress serviceKubernetes 上的 SignalR,让我们加密入口服务
【发布时间】:2019-06-17 08:58:32
【问题描述】:

我在 kubernetes 服务上有 dotnet core signalR 应用程序。最重要的是,让我们加密入口服务为我提供 SSL 证书。

我可以在 Let's encrypt 证书下获取网站,一切似乎都有效。

如果我想通过 wss 协议连接 signalR,则每 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

我也尝试过纯 websocket 连接,但它是一样的。我该如何解决这个问题?

PS:如果我为 kestrel 服务器定义物理 SSL 证书,它就可以工作。

【问题讨论】:

    标签: asp.net-core kubernetes .net-core signalr lets-encrypt


    【解决方案1】:

    我遇到了类似的问题,这就是我的处理方式 注意:此解决方案是 dotnet core 2.2 中纯 websocket 的有效解决方案,我尚未使用 signalR 对其进行测试

    使用 Apache 作为代理 Microsoft doc here

    <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>
    

    所以基本上会发生的情况是,在 Apache 之前,流量将是 HTTPS,然后 Apache 将充当代理并将流量交给 Kestrel。 它可能很难配置,但事实并非如此, - 配置 Apache 以使用 HTTP 和 WS 然后像这样配置让我们加密:

    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 访问您的网站,到目前为止它从未失败过 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-02
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      相关资源
      最近更新 更多