yumata / lampa

GNU General Public License v2.0
336 stars 87 forks source link

WebSocket opening handshake was canceled #125

Open usmanec opened 2 years ago

usmanec commented 2 years ago

Из-за устаревших CA сертификатов на устройствах получаем такую бесконечную ошибку в логе

...
2022-04-20 01:32:06.230 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(14004)] "WebSocket connection to 'wss://cub.watch:8020/' failed: WebSocket opening handshake was canceled", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (14004)
2022-04-20 01:32:06.230 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(16581)] "Socket", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (16581)
2022-04-20 01:32:14.110 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(14004)] "WebSocket connection to 'wss://cub.watch:8020/' failed: WebSocket opening handshake was canceled", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (14004)
2022-04-20 01:32:14.110 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(16581)] "Socket", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (16581)
2022-04-20 01:32:20.940 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(14004)] "WebSocket connection to 'wss://cub.watch:8020/' failed: WebSocket opening handshake was canceled", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (14004)
2022-04-20 01:32:20.940 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(16581)] "Socket", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (16581)
2022-04-20 01:32:28.620 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(14004)] "WebSocket connection to 'wss://cub.watch:8020/' failed: WebSocket opening handshake was canceled", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (14004)
2022-04-20 01:32:28.620 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(16581)] "Socket", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (16581)
2022-04-20 01:32:36.660 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(14004)] "WebSocket connection to 'wss://cub.watch:8020/' failed: WebSocket opening handshake was canceled", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (14004)
2022-04-20 01:32:36.670 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(16581)] "Socket", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (16581)
2022-04-20 01:32:46.840 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(14004)] "WebSocket connection to 'wss://cub.watch:8020/' failed: WebSocket opening handshake was canceled", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (14004)
2022-04-20 01:32:46.840 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(16581)] "Socket", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (16581)
2022-04-20 01:32:53.230 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(14004)] "WebSocket connection to 'wss://cub.watch:8020/' failed: WebSocket opening handshake was canceled", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (14004)
2022-04-20 01:32:53.230 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(16581)] "Socket", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (16581)
2022-04-20 01:33:02.690 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(14004)] "WebSocket connection to 'wss://cub.watch:8020/' failed: WebSocket opening handshake was canceled", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (14004)
2022-04-20 01:33:02.710 12717-12717/top.rootu.lampa I/chromium: [INFO:CONSOLE(16581)] "Socket", source: http://lampa.mx/app.min.js?v=0.7532336805216564 (16581)
...

ошибка пропадает если обновить CA сертификаты на устройстве через рута, но обычный пользователь и не всегда лампу настроить может...

Судя по https://www.sslchecker.com/sslchecker?su=23c8e4c5346422d5b9db01cd91daa47e (см. Certificate Chain) отсутствует цепочка сертификатов, исходя из этого пологаю к nginx прикреплён только выданный сертификат, возможно проблема решиться указав в файле публичного сертификата ещё сертификаты удостоверяющих центров (цепочку сертификатов), т.к. корневой CA валиден с 2009 года по 2029 возможно поможет.

Если не поможет, есть ещё варианты решения: воспользоватся сертботом ZeroSSL (получает сертификаты не с первой попытки, но получает, по протоколу ACME -- всё бесплатно). Let’s Encrypt не подходит, так как его корневой истёк осенью 2021, а о новом корневом старые устройства не знают.

Дополненный цепочками или новый сертификат можно повесить на отдельный порт, чтобы не ломать текущую схему, а в лампе у вебсокета менять порты если подключение не удалось, тем самы меняя сертификаты.

usmanec commented 2 years ago

Провёл эксперимент.

  1. Получил сертификат ZeroSSL с помощью acme.sh и добавил его к тестовому домену в кофигах nginx
  2. Проксировал nginx'ом wss://cub.watch:8020 по инструкции
  3. Подключил плагин http://test.rootu.top/wsproxy.js

Ошибка исчезла, с лампы на лампу можно отправлять карточку, но как даже временное решение не подходит, т.к. устройства привязываются к IP моего сервера, а ни клиента. Соответственно из куба ничего не посылается, да и разные клиенты будут видеть устройства друг-друга.

Пример конфигурации nginx:

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen  80;
    listen  443 ssl;

    ssl_certificate /home/test_user/.acme.sh/test.rootu.top/fullchain.cer; # Цепочка сертификатов
    ssl_certificate_key /home/test_user/.acme.sh/test.rootu.top/test.rootu.top.key; # Приватный ключ

    server_name  test.rootu.top;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /wsproxy/ {
        proxy_pass https://cub.watch:8020;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    proxy_set_header X-Forwarded-For $remote_addr; # or $proxy_add_x_forwarded_for
        proxy_set_header  X-Real-IP       $remote_addr;
    }
}

@yumata, посмотри пожалуйста, хотелось бы увидеть исправления до выхода клиента под android 4.1+ в массы (да и на куб прилетает бесполезный трафик). Для совместимости приложение использует в качестве webview - xwalkview (Crosswalk) на базе Chrome/53.0.2785.143, так как стандартный webview до 5го андройда необновляемый. Если бы о проблемах с подключением просто бы писался бы лог, то возможно и этого issue не было бы, проблема в том что при каждом неудачном подключении сrosswalk - клиента спамит тостом "Request was denied for security". В последних версиях сrosswalk (а он ставится отдельным пакетом из маркета) программно не исправить, так как тост вызывается до onReceivedSslError(), для всех ошибок попавших под условие. Данная проблема скорее всего аналогична этой (в группе куба) - Наверно не поддерживается SSL и не может подключится., но она решаема.