Рейтинг:0

HTTPS разрывает соединение Socket.io

флаг ch

Описание неисправности
В моей тестовой среде есть чат-боты Rasa, работающие в док-контейнерах.Fronted чат-бота — это виджет веб-чата Botfront на веб-сайте, обслуживаемом Apache2 на том же сервере. Я также установил Nginx в качестве обратного прокси-сервера, который затем обслуживает виртуальные домены Apache. Чат-бот работает напрямую из Apache http://testibotti2.omnia.fi:444/ а также через обратный прокси http://testibotti2.omnia.fi/ но при использовании https это не работает, т.е. виджет чат-бота не отображается https://testibot1.omnia.fi/

Моя среда

Версия сервера: Apache/2.4.41 (Ubuntu)  
Версия nginx: nginx/1.18.0 (Ubuntu  
Убунту 18.04  
Докер версии 20.10.9, сборка c2ea9bc  
docker-compose версии 1.29.2, сборка 5becea4c  

Файлы конфигурации

Обратный прокси-сервер Nginx (я закомментировал SSL-часть testibotti2 для целей тестирования)

сервер {

   #корень /var/www/html/;
   #index index.html index.htm;

   имя_сервера testibot1.omnia.fi;
   #имя_сервера 127.0.0.1
   индекс index.php index.html index.htm index.nginx-debian.html;
   корень /var/www/public_html/testibot1;

   место расположения \ {

   proxy_pass http://testibot1.omnia.fi:444;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $remote_addr;
   proxy_set_header Хост $host;  
   # Я пробовал эти параметры ниже, но безуспешно
   #proxy_redirect выключен;
   #proxy_set_header X-Forwarded-Proto https;
   #proxy_set_header Схема X-Forwarded-Proto $;  
   # также эти параметры я добавил после установки SSL, безуспешно
   прокси_http_версия 1.1;
   proxy_set_header Обновить $http_upgrade;
   proxy_set_header Соединение "обновление";

   }

   журнал_доступа /var/log/nginx/testibot1.fi_access.log;
   error_log /var/log/nginx/testibot1.fi_error.log;


   слушать 443 ssl; # под управлением Certbot
   ssl_certificate /etc/letsencrypt/live/testibot1.omnia.fi/fullchain.pem; # под управлением Certbot
   ssl_certificate_key /etc/letsencrypt/live/testibot1.omnia.fi/privkey.pem; # под управлением Certbot
   включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot

}

сервер {

   #корень /var/www/html/;
   #index index.html index.htm;

   имя_сервера testibotti2.omnia.fi;
   #имя_сервера 127.0.0.1
   индекс index.php index.html index.htm index.nginx-debian.html;
   корень /var/www/public_html/testibotti2;

   место расположения \ {

   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $remote_addr;
   proxy_set_header Хост $host;
   proxy_pass http://testibotti2.omnia.fi:444;
   }

   журнал_доступа /var/log/nginx/testibotti2.fi_access.log;
   error_log /var/log/nginx/testibotti2.fi_error.log;


# слушать 443 ssl; # под управлением Certbot
# ssl_certificate /etc/letsencrypt/live/testibot1.omnia.fi/fullchain.pem; # под управлением Certbot
# ssl_certificate_key /etc/letsencrypt/live/testibot1.omnia.fi/privkey.pem; # под управлением Certbot
# включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot

}

сервер {
    если ($host = testibot1.omnia.fi) {
        вернуть 301 https://$host$request_uri;
    } # управляется Certbot


   слушать 80;

   имя_сервера testibot1.omnia.fi;
    вернуть 404; # под управлением Certbot


}

# сервер {
# если ($host = testibotti2.omnia.fi) {
# вернуть 301 https://$host$request_uri;
# } # под управлением Certbot


# слушать 80;

# имя_сервера testibotti2.omnia.fi;
# вернуть 404; # под управлением Certbot


#}

Настройка виджета веб-чата Botfront

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/lib/index.min.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
Testisaitti 1
<div id="webchat"></div>
<script>
  WebChat.default.init({
    showFullScreenButton: true,
    selector: "#webchat",
    initPayload: "/tervetuloa",
    customData: {"language": "fi"}, // arbitrary custom data. Stay minimal as this will be added to the socket
    socketUrl: "http://testibot1.omnia.fi:5006",
    socketPath: "/socket.io/",
    embedded: false,
    title: "AsPa botti",
    subtitle: "Testibotti 1",
    inputTextFieldHint: "Vastaa kysymyksiin",
    profileAvatar:"robot_icon.png",
    params: {"storage": "session"} // can be set to "local"  or "session". details in storage section.
  })
</script>

</body>
</html>  


Эта ошибка, которую я вижу в окне отладки браузера

Смешанное содержимое: страница по адресу «<URL>» была загружена через HTTPS, но запросила небезопасную конечную точку XMLHttpRequest «<URL>». Этот запрос был заблокирован; контент должен передаваться через HTTPS.

Журнал ошибок Nginx

paulii@vetbot7:/var/www/public_html/testibot1$ sudo tail -f /var/log/nginx/testibot1.fi_error.log
[sudo] пароль для paulii:
18.10.2021 10:04:50 [ошибка] 3469367#3469367: *60 open() "/var/www/public_html/testibot1/omnia.fi.db" не удалось (2: нет такого файла или каталога), клиент : 89.248.173.145, сервер: testibot1.omnia.fi, запрос: "GET /omnia.fi.db HTTP/1.1", хост: "testibot1.omnia.fi"
18.10.2021 10:04:50 [ошибка] 3469367#3469367: *60 open() "/var/www/public_html/testibot1/omnia.fi.sqlite" не удалось (2: нет такого файла или каталога), клиент : 89.248.173.145, сервер: testibot1.omnia.fi, запрос: "GET /omnia.fi.sqlite HTTP/1.1", хост: "testibot1.omnia.fi"
18.10.2021 10:05:26 [ошибка] 3469367#3469367: *66 open() "/var/www/public_html/testibot1/favicon.ico" не удалось (2: нет такого файла или каталога), клиент: 91.153 .58.139, сервер: testibot1.omnia.fi, запрос: "GET /favicon.ico HTTP/1.1", хост: "testibot1.omnia.fi", реферер: "https://testibot1.omnia.fi/"
18.10.2021, 10:05:52 [крит] 3469367#3469367: *81 SSL_do_handshake() не удалось (SSL: ошибка: 141CF06C: подпрограммы SSL: tls_parse_ctos_key_share: неверный общий ключ) при установлении связи SSL, клиент: 35.203.251.54, сервер : 0.0.0.0:443
18.10.2021 10:05:54 [крит] 3469367#3469367: *90 SSL_do_handshake() не удалось (SSL: ошибка: 141CF06C: подпрограммы SSL: tls_parse_ctos_key_share: неверный общий ключ) при установлении связи SSL, клиент: 107.178.200.215, сервер : 0.0.0.0:443
18.10.2021, 10:07:15 [крит] 3469367#3469367: *103 SSL_do_handshake() не удалось (SSL: ошибка: 141CF06C: подпрограммы SSL: tls_parse_ctos_key_share: неверный общий ключ) при квитировании SSL, клиент: 107.178.237.2, сервер : 0.0.0.0:443
18.10.2021 11:31:10 [ошибка] 3470484#3470484: *2 open() "/var/www/public_html/testibot1/5007" не удалось (2: нет такого файла или каталога), клиент: 91.153.58.139 , сервер: testibot1.omnia.fi, запрос: "GET /5007 HTTP/1.1", хост: "testibotti2.omnia.fi"
18.10.2021 11:31:12 [ошибка] 3470484#3470484: *2 open() "/var/www/public_html/testibot1/5007" не удалось (2: нет такого файла или каталога), клиент: 91.153.58.139 , сервер: testibot1.omnia.fi, запрос: "GET /5007 HTTP/1.1", хост: "testibotti2.omnia.fi"
18.10.2021 11:31:21 [ошибка] 3470484#3470484: *2 open() "/var/www/public_html/testibot1/5007" не удалось (2: нет такого файла или каталога), клиент: 91.153.58.139 , сервер: testibot1.omnia.fi, запрос: "GET /5007 HTTP/1.1", хост: "testibotti2.omnia.fi"
18.10.2021 11:32:21 [ошибка] 3470484#3470484: *3 open() "/var/www/public_html/testibot1/favicon.ico" не удалось (2: нет такого файла или каталога), клиент: 91.153 .58.139, сервер: testibot1.omnia.fi, запрос: "GET /favicon.ico HTTP/1.1", хост: "testibotti2.omnia.fi", реферер: "https://testibotti2.omnia.fi/"

Рейтинг:0
флаг de

Причина проблемы буквально напечатана в консоли разработчика браузера:

подробное сообщение об ошибке

Поэтому вам необходимо выполнять запросы XHR через HTTPS-соединение.

Вероятно, вы захотите добавить еще одно местоположение в конфигурацию nginx:

расположение /socket.io {
   proxy_pass http://localhost:5006;
}

а также изменив URL-адрес в конфигурации внешнего интерфейса:

    socketUrl: "https://testibot1.omnia.fi",
флаг ch
Спасибо, я добавил это в конфиг Nginx, я думаю, что это "/" должно быть этим "\" сервер { расположение \socket.io { proxy_pass http://localhost:5006; } } и это для index.html //socketUrl: "http://testibot1.omnia.fi:5006", socketUrl: "https://testibot1.omnia.fi", Но все еще не работает, теперь это сообщение об ошибке ПОЛУЧИТЬ https://testibot1.omnia.fi/socket.io/?EIO=3&transport=polling&t=NoJZNCe 404 (не найдено)
флаг de
Вы перезагрузили nginx? Кроме того, обычно имеет смысл выполнить проверку работоспособности с помощью `nginx -t`
флаг de
Тем не менее, я не уверен, что вам следует использовать обратную косую черту (\). В качестве разделителей пути следует использовать прямую косую черту (http://nginx.org/en/docs/beginners_guide.html), а обратную косую черту обычно используют для экранирования специальных символов.
флаг ch
paulii@vetbot7:/etc/nginx/sites-available$ sudo nginx -t nginx: синтаксис файла конфигурации /etc/nginx/nginx.conf в порядке nginx: проверка файла конфигурации /etc/nginx/nginx.conf прошла успешно paulii@vetbot7:/etc/nginx/sites-available$ sudo systemctl перезагрузить nginx paulii@vetbot7:/etc/nginx/sites-available$ sudo systemctl перезапустить nginx paulii@vetbot7:/etc/nginx/сайты-доступны$
флаг ch
Я пробовал с "/" и не работает. Теперь это ошибка «Не удалось загрузить ресурс: сервер ответил со статусом 404 (не найдено)»
djdomi avatar
флаг za
не говорите, что это не работает, обновите вопрос и покажите нам новую конфигурацию;)
флаг ch
Что ты имеешь в виду? Это не работает!
Рейтинг:0
флаг ch

у меня все работает

это необходимо в файле конфигурации обратного прокси-сервера Ngingx

сервер {


   имя_сервера testibot1.omnia.fi;
   индекс index.php index.html index.htm index.nginx-debian.html;
   корень /var/www/public_html/testibot1;

   место расположения / {

   proxy_pass http://testibot1.omnia.fi:444;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $remote_addr;
   proxy_set_header Хост $host;

   }

   расположение /socket.io/ {
   proxy_pass http://testibot1.omnia.fi:5006/socket.io/;
   прокси_http_версия 1.1;
   proxy_set_header Обновить $http_upgrade;
   proxy_set_header Соединение «обновление»;
   proxy_set_header Хост $host;
   proxy_cache_bypass $http_upgrade;
   }  

и это необходимо на веб-странице

socketUrl: "https://testibot1.omnia.fi",

Большое спасибо Александр Тарасов! Ваша идея привела меня на правильный путь, и после десятков попыток я нашел правильное сочетание

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.