[gelöst] Connection lost, trying a reconnect every 5 seconds auf IPad via NGINX

Begonnen von th0nix, 10 Januar 2021, 12:14:38

Vorheriges Thema - Nächstes Thema

th0nix

Hallo zusammen,

ich versuche gerade das FHEMWEB via Reverse Proxy (NGINX), welcher die Anmeldung via Client Zertifikat übernimmt, zu Verfügung zu stellen.

Auf einem Firefox unter Linux funktioniert das alles super. Nur auf dem IPad/IPhone bekomme ich einen den Fehler Connection lost, trying a reconnect every 5 seconds
Scheinbar werden die Websockets nicht durchgereicht.

Aufgrund von unterschiedlichen Formen habe ich schon verschiedene NGINX Configeinstellungen getestet. Habe andere SSL Versionen getestet. Bin aber bisher noch nicht weitergekommen.

Hat jemand von euch eine Idee was hier das Problem sein könnte, bzw was ich noch testen kann ?

Meine NGINX Config ( default.conf.template) für das standard docker image sieht wie folgt aus:



# Smart Hardening
client_body_buffer_size  1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
server_tokens off;

log_format  custom '$remote_addr - $ssl_client_s_dn - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$upstream_response_time"';

# Required for Websocket
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}



server {
    listen 80;
    return 301 https://server$request_uri;
}

server {

    listen 443 ssl;
    keepalive_timeout 70;

    server_name server

    # check user agent
    # Initial Wert fuer Variable
    set $ua_type "unknown";
    if ($http_user_agent ~* '(iPhone|iPod|Opera Mini|Android.*Mobile|NetFront|PSP|BlackBerry|Windows Phone)') {
      set $ua_type "@mobile";
    }

    ssl_certificate           /etc/letsencrypt/live/server/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/server/privkey.pem;

    # client certificate
    ssl_client_certificate /etc/nginx/client_certs/root-ca.cert.pem;
    # make verification optional, so we can display a 403 message to those
    # who fail authentication
    ssl_verify_client optional;


    ssl_protocols TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;


    access_log  /var/log/nginx/access.log custom;

    location /fhem {
      if ($ssl_client_verify != SUCCESS) {
        return 403;
      }

     # Required for Websocket
      proxy_http_version 1.1;
      proxy_read_timeout 600s;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_cache_bypass $http_upgrade;

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;


      # Gehe zu FHEMWEB wenn kein mobiler Browser
      if ($ua_type != "@mobile"){
          proxy_pass          http://fhemIP:8083;
      }
      # Gehe zu FHEMWEB smallscreen wenn mobiler Browser
      if ($ua_type = "@mobile"){
          proxy_pass          http://<fhemIP>:8084;
      }
   }
}





th0nix

Hallo zusammen,

nach ein wenig Experimentieren habe ich einen Weg gefunden.  ;D

Im Kern liegt es daran das Standardmäßig der Safari - zumindest bei IOS - für den Websocket kein SSL Client Auth macht.
Bei mir im Log erschien die 403 Meldungen aber erst nachdem ich TLS 1.2 anstelle von 1.3 aktiviert hatte und das IPad an ein Debug Port angeschlossen hatte.

Im Safari bekommt man aber nur im Log einen OSStatus error -9836 -> errSSLPeerProtocolVersion (https://www.osstatus.com/search/results?platform=all&framework=all&search=9836)

Die Lösung (zumindest für IOS 14.2)
Auf dem IPad in den Einstellungen -> Safari -> Erweitert (ist ganz unten) -> Experimentelle Features -> NSURLSession WebSocket aktiviert


PS: Hilfreich für das Debug war die Anleitung: https://drunknzombiecow.tumblr.com/post/166219439018/debug-ios-safari-in-chrome-on-ubuntu

tpm88

Zitat

Die Lösung (zumindest für IOS 14.2)
Auf dem IPad in den Einstellungen -> Safari -> Erweitert (ist ganz unten) -> Experimentelle Features -> NSURLSession WebSocket aktiviert
PS: Hilfreich für das Debug war die Anleitung: https://drunknzombiecow.tumblr.com/post/166219439018/debug-ios-safari-in-chrome-on-ubuntu

Wow. Top, danke. Die Lösung zum gleichen Fehler funktioniert ebenfalls für einen Apache Reverse Proxy mit vorgeschalteten HAProxy LoadBalancer.

VG
Tobi
Test FHEM Server on RPi, CUL_HM
Prod FHEM Server on Odroid HC1, HM-USB, JeeLink
Devices: diverse HM, IT1500, 1wire, LaCrosse, MQTT