HA Proxy и Websockets
Я устанавливаю свой первый обратный прокси-сервер HAProxy. Это будет прокси для приложения HTML5, запущенного на tomcat с другого сервера. Мне удалось получить его через прокси через HTTP, перенаправить все запросы на HTTPS и реализовать HSTS. Однако после этого я понял, что он также пытается загрузить соединение через веб-сокет. Проблема в том, что загружаемое веб-сокет соединение небезопасно (ws://) и небезопасно (wss://). Конечно, Chrome (и, вероятно, несколько браузеров) жалуются на загрузку небезопасного скрипта через безопасное соединение. Вот ошибка, которую я получаю:
Connecting via WebSocket using url ws://website.domain.com:9091/webclient/
Mixed Content: The page at 'https://website.domain.com/webclient/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://website.domain.com:9091/webclient/'. This request has been blocked; this endpoint must be available over WSS.
Caught WebSocket error: SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
Все они были загружены /webclient/script/ajaxclient.js:210
Поскольку это стороннее приложение, я не уверен, смогу ли я заставить их изменить свое приложение. Поэтому мне было интересно, могу ли я что-то сделать на сервере HAProxy, чтобы принудительно установить безопасное соединение через веб-сокет. Какие-нибудь мысли?
Вот мой файл конфигурации HAProxy для справки:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 1000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
# Default SSL cert locations
ca-base /etc/haproxy/ssl_2015
crt-base /etc/haproxy/ssl_2015
# Default ssl ciphers
ssl-default-bind-ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4
# max size of temp DHE keys that are generated
tune.ssl.default-dh-param 4096
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
option http-server-close
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
timeout tunnel 4hrs # long timeout for Websocket connections
maxconn 3000
#---------------------------------------------------------------------
# http frontend
#---------------------------------------------------------------------
frontend http_https_frontend
bind 192.168.2.201:80
redirect scheme https if !{ ssl_fc }
bind 192.168.2.201:443 ssl crt /etc/haproxy/ssl_2015/ssl_crt.pem
acl secure dst_port eq 443
rspadd Strict-Transport-Security:\ max-age=16000000;\ includeSubDomains;\ preload;
rsprep ^Set-Cookie:\ (.*) Set-Cookie:\ \1;\ Secure if secure
# # routing based on websocket protocol header
# acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws
use_backend ws_backend if is_websocket
# # 16000000 seconds: a bit more than 6 months
# http-response set-header Strict-Transport-Security max-age=16000000;\ includeSubDomains;\ preload;
default_backend https_backend
#---------------------------------------------------------------------
# http backend
#---------------------------------------------------------------------
backend https_backend
reqadd X-Forwarded-Proto:\ https
server websvr1_http 192.168.1.125:8080
#---------------------------------------------------------------------
# ws backend
#---------------------------------------------------------------------
backend ws_backend
server websvr1_ws 192.168.1.125:9091
Сервер HAProxy - это сервер CentOS 7.1.1503, на котором работает HAProxy 1.5.4.
Заранее спасибо!
1 ответ
Поскольку это стороннее приложение, я не уверен, смогу ли я заставить их изменить свое приложение. Поэтому мне было интересно, могу ли я что-то сделать на сервере HAProxy, чтобы принудительно установить безопасное соединение через веб-сокет.
Это зависит в основном от стороннего приложения. Если приложение специально использует ws:
протокола, вы ничего не можете сделать на стороне HAProxy - браузеры даже не подключатся к экземпляру HAProxy, поэтому вам даже не дают возможности что-либо с этим сделать.
Вам нужно было бы открыть проблему со сторонними разработчиками приложений и сделать так, чтобы они настраивали протокол веб-сокета или добавили какое-либо обнаружение (если страница загружается по HTTPS, тогда используйте WSS).
В качестве альтернативы вы можете ввести перезапись контента, где у вас есть что-то, что изменяет исходящий контент, чтобы переписать ws:/ to wss://. HAProxy не может этого сделать, но Nginx вместе с sub_filter
модуль может.