SignalR di kubernetes dengan mari mengenkripsi layanan masuknya

Saya memiliki aplikasi dotnet core signalR pada layanan kubernetes. Selain itu, memungkinkan layanan enkripsi ingress memberi saya sertifikat SSL.

Saya bisa mendapatkan situs web di bawah Mari mengenkripsi sertifikat dan semuanya tampak valid.

Jika saya ingin menghubungkan signalR dengan protokol wss, setiap 2 detik koneksi terputus.

Kesalahannya adalah:

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

Log server adalah:

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.

Versi Aplikasi:

netcoreapp2.2
Microsoft.AspNet.SignalR -v 2.4.0

Saya juga mencoba koneksi websocket murni tetapi tetap sama. Bagaimana cara mengatasi masalah ini?

PS: Berhasil jika saya mendefinisikan sertifikat SSL fisik ke server kestrel.


person Mert Demir    schedule 23.01.2019    source sumber


Jawaban (1)


Saya memiliki masalah serupa dan inilah cara saya mengelolanya catatan: solusi ini adalah solusi yang berfungsi untuk websocket murni di dotnet core 2.2 saya belum mengujinya dengan signalR

gunakan Apache sebagai proksi Microsoft doc di sini

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

jadi pada dasarnya yang akan terjadi adalah lalu lintasnya adalah HTTPS hingga Apache dan kemudian Apache akan bertindak sebagai proxy dan menyerahkan lalu lintas tersebut ke Kestrel. mungkin sulit untuk dikonfigurasikan tetapi sebenarnya tidak, - konfigurasikan Apache agar berfungsi dengan HTTP & WS lalu konfigurasikan mari kita enkripsi seperti ini:

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'

baris perintah berikutnya akan mengkonfigurasi konfigurasi SSL Apache Anda

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

maka Anda akan dapat mengakses situs Anda melalui HTTPS & WSS, Sampai sekarang tidak pernah gagal :)

person Ali Alp    schedule 14.03.2019