asp.net-core - Kubernetes 上的 SignalR,让我们加密入口服务

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

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

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

如果我想通过 wss 协议(protocol)连接 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:如果我为红隼服务器定义了物理 SSL 证书,它就可以工作。

最佳答案

我有类似的问题,这就是我管理它的方式
注意:此解决方案是 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>

所以基本上会发生的是流量将是 HTTPS 直到 Apache,然后 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 访问您的网站,到目前为止它从未失败过 :)

关于asp.net-core - Kubernetes 上的 SignalR,让我们加密入口服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54332844/

相关文章:

c# - JsonProperty c# 将字典值序列化为数组

kubernetes - Kubernetes上同一Pod中的两个容器

c# - Entity Framework Core 返回一些选择

asp.net - 应如何使用 CompiledRazorAssemblyPart 加载 Razor View ?

c# - 如何使用.Net Core验证KeyCloak提供的JWT?

kubernetes - "Error from server (Timeout): the server was unable to return a response in the time allotted, but may still be processing the request (get nodes)"

kubernetes - Google容器引擎集群在日志中显示大量dns错误

c# - 如何让grpc像WCF一样抛出原始异常?

c# - 将 JSON 文件从 .NET Core 批量上传/导入到 Azure Cosmos DB

asp.net-core - ASP .NET Core web api 在中间件中设置 cookie