Существует ли предписанная методология для защиты указанной конечной точки веб-сокета с использованием TLS/SSL при размещении на PCF и работе за PCF HAProxy?
Несколько вещей:
Вам не нужно настраивать сертификаты или что-то подобное при развертывании вашего приложения в PCF. Платформа позаботится обо всем этом. В вашем случае это, скорее всего, будет обрабатываться HAProxy, но это может быть какой-то другой балансировщик нагрузки или даже Gorouter, в зависимости от того, какая рабочая группа вашей платформы установила PCF. Конечным результатом является то, что TLS сначала завершается, прежде чем он попадет в ваше приложение, поэтому вам не нужно об этом беспокоиться.
Ваше приложение всегда должно заставлять пользователей использовать HTTPS. То, как вы это сделаете, зависит от используемого вами языка/фреймворка, но у большинства из них есть для этого определенные функции.
Этот процесс обычно работает, проверяя, был ли входящий запрос через HTTP или HTTPS. Если это HTTP, то вы выполняете перенаправление на тот же URL-адрес, но через HTTPS. Это важно для всех приложений, а не только для тех, которые используют WebSockets. Шифровать все вещи.
Имейте в виду, что вы находитесь за одним или несколькими обратными прокси-серверами, поэтому, если вы делаете это вручную, вам нужно будет учитывать, что находится в x-forwarded-proto
или x-forwarded-port
, а не только восходящее соединение, которым будет Gorouter, а не браузер вашего клиента.
https://docs.pivotal.io/platform/application-service/2-7/concepts/http-routing.html#http-headers
Если вы принудительно используете HTTPS (№ 1 выше), ваши пользователи не смогут инициировать небезопасное подключение WebSocket к вашему приложению. Браузеры, такие как Chrome и Firefox, имеют ограничения для предотвращения небезопасного соединения WebSocket при загрузке сайта по HTTPS.
Вы получите сообщение вроде The operation is insecure
в Firefox или Cannot connect: SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
в Chrome.
У меня возникли проблемы с интерпретацией этой информации, например, мы должны открыть порт 4443 на сервере, и PCF по умолчанию должен выбрать его как безопасный порт, который гарантирует, что незащищенные соединения не могут быть установлены? Или для этого требуется выполнить некоторую настройку на HAProxy?
С точки зрения приложения вы не делаете ничего другого. Ваше приложение должно запускаться и прослушивать назначенный порт, то есть то, что находится в $PORT
. То же самое для трафика HTTP, HTTP, WS и WSS. Короче говоря, вам как разработчику приложений не нужно думать об этом при развертывании в PCF.
Единственным исключением может быть ситуация, когда ваша команда по эксплуатации платформы использует балансировщик нагрузки, который изначально не поддерживает WebSockets. В этом случае, чтобы обойти проблему, им необходимо разделить трафик. HTTP и HTTPS идут через традиционные порты 80 и 443, и они будут направлять WebSockets на другой порт. Документы PCF рекомендуют 4443, где вы, вероятно, видите этот порт. Я не могу сказать вам, настроена ли ваша платформа таким образом, но если вы знаете, что используете HAproxy, скорее всего, это не так.
https://docs.pivotal.io/platform/application-service/2-8/adminguide/supporting-websockets.html
В любом случае, если вы не знаете, просто запустите приложение и попробуйте инициировать безопасное соединение WebSocket через порт 443 и посмотрите, работает ли оно. Если это не удается, попробуйте 4443 и посмотрите, работает ли это. Это или спросите у вашей команды по эксплуатации платформы.
Как бы то ни было, даже если вам нужно использовать порт 4443, нет никакой разницы с вашим приложением, работающим на PCF. Единственная разница будет заключаться в вашем коде Javascript, который инициирует соединение WebSocket. Ему нужно знать, чтобы использовать порт 4443 вместо 443 по умолчанию.
Надеюсь, это поможет!
23.01.2020