Конфигурирование виртуального хоста для защищенной веб-сокета с помощью храповой библиотеки веб-сокетов на веб-сервере apache - PullRequest
0 голосов
/ 13 апреля 2020

Я реализовал / попытался реализовать веб-сокет для связи между пользователями на экземпляре ec2, работающем с linux с веб-сервером apache. У меня было это работает, когда я впервые настроил его, где мой трещотка веб-сокет указал на порт 8081 без TLS. Благодаря этой конфигурации я смог перейти на веб-сокет и отправлять / получать данные - через незащищенный веб-сокет. Это было возможно только через IP-адрес, а не через фактический URL. Я запускаю веб-сокет на поддомене.

    <VirtualHost *:443>
        DocumentRoot "/var/www/html/video"
        ServerName video.domain.com

        SSLEngine on
        SSLCertificateFile ./certs/server.crt
        SSLCertificateKeyFile ./certs/server.key

#       ProxyPass /ratchet/ ws://video.domain.com:8081/

        <Directory "/var/www/html/video">
                AllowOverride All
                Require all granted
        </Directory>
</VirtualHost>

Приведенное выше решение работает, когда я использую IP-соединение на основе веб-сокета для подключения к веб-сокету через JS API веб-сокета.

I пробовал и WSS, WS, с портами и без них и т. д. c для API websocket, но все же нижеприведенный код - это единственное, что я могу заставить работать.

let socket = new WebSocket("ws://server_ip:8081");

Я прочитал много вопросов о стековом потоке, касающихся добавления прокси-сервера в VH, но он не обновляет запрос. Кроме того, я попытался создать свой собственный виртуальный хост, и он тоже не работает.

Я думаю, стоит упомянуть, что у меня есть CDN cloudflare, через который проходят запросы. Надеюсь получить немного глаз. Застрял на некоторое время.

1 Ответ

0 голосов
/ 13 апреля 2020

У меня недостаточно репутации для комментария, поэтому ответьте:

Прошло много времени с тех пор, как я ввязался в это, и моей первой мыслью было, что вам действительно нужен ProxyPass, но когда я посмотрел на мой конфиг, это не тот случай.

Я выхожу на конечность и думаю, что здесь проблема с вашим VH, вы явно слушаете порт 443 (https), но я считаю, что wss есть другой порт, который он слушает, так что, возможно, вы можете попробовать другой порт. Помимо этого, вы также можете попытаться сделать new WebSocket('https://video.domain.com') и включить прокси в VH, таким образом, безопасное соединение обрабатывается уровнем http. Но так как браузер затем попытается обновить запрос до сокета, я сомневаюсь, что это будет работать.

Я должен упомянуть, что в моем случае я использовал websockets для открытия соединения mqtt, так как браузер не реализует mqtt это делается через wss.

Если это не так, я мог бы попытаться глубже погрузиться во внутреннюю работу библиотеки mqtt, которую я использую, чтобы разобрать, как устанавливается соединение.

I надеюсь, что все это поможет: D


edit

, так как в комментариях не хватило места, я разместлю его здесь:

не относится к сокетам, но на apache и прокси: у директивы ProxyPass есть аналог ProxyPassReverse для этой цели.

<virtualhost IPv4:443 [IPv6]:443>
        Servername knowledge.domain.com:443
        ServerAlias knowledge.domain.com
        ServerAdmin webmaster@domain.com

        DocumentRoot /path/to/documentRoot

        <Directory /path/to/documentRoot>
                Options -Indexes -FollowSymLinks -SymLinksIfOwnerMatch
        </Directory>

        SSLEngine On
        SSLCertificateFile /path/to/ssl.crt
        SSLCertificateKeyFile /path/to/ssll.key
        SSLCACertificateFile /path/to/ssll.cer

        Header always set Strict-Transport-Security: "max-age=31536000; includeSubDomains; preload"
        Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

        ProxyRequests Off
        ProxyPreserveHost On
        ProxyVia Full
        <Proxy *>
                Require all granted
        </Proxy>


        <Location />
                ProxyPass http://127.0.0.1:3000/
                ProxyPassReverse http://127.0.0.1:3000/
        </Location>

        <Directory />
                Options -FollowSymLinks -Indexes -SymLinksIfOwnerMatch
        </Directory>

        CustomLog "/path/to/logs/access.log" combined
        ErrorLog "/path/to/logs/error.log"
        LogLevel warn
</virtualhost>

это пример моего прокси-конфи для nodejs приложения

...