SignalR บน kubernetes พร้อมเข้ารหัสบริการทางเข้ากันเถอะ

ฉันมีแอปพลิเคชัน dotnet core signalR บนบริการ kubernetes ยิ่งไปกว่านั้น บริการเข้ารหัสทางเข้ายังมอบใบรับรอง SSL ให้ฉันด้วย

ฉันสามารถรับเว็บไซต์ภายใต้ Let's encrypt Certificate และทุกอย่างดูถูกต้อง

หากฉันต้องการเชื่อมต่อ 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

ฉันลองใช้การเชื่อมต่อ websocket ล้วนๆ แต่ก็เหมือนกัน ฉันจะแก้ไขปัญหานี้ได้อย่างไร?

PS: มันจะได้ผลถ้าฉันกำหนดใบรับรอง SSL ทางกายภาพให้กับเซิร์ฟเวอร์ชวา


person Mert Demir    schedule 23.01.2019    source แหล่งที่มา


คำตอบ (1)


ฉันมีปัญหาที่คล้ายกัน และนี่คือวิธีที่ฉันจัดการ หมายเหตุ: โซลูชันนี้เป็นวิธีแก้ปัญหาที่ใช้งานได้สำหรับ websocket แท้ใน dotnet core 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 จากนั้นกำหนดค่าให้เข้ารหัสดังนี้:

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