限制 PCF 中不安全的 Web 套接字协议连接

Restrict insecure web socket protocol connections in PCF

我们在 preprod azure PCF 环境中托管一个应用程序,该环境公开 websocket 端点供客户端设备连接。当托管在 PCF 上并在 PCF HAProxy 后面使用 TLS/SSL 和 运行 时,是否有规定的方法来保护所述 websocket 端点?

我在解释此信息时遇到问题,例如,我们是否应该在服务器上公开端口 4443,PCF 应默认将其选为安全端口以确保无法建立不安全的连接?还是需要在 HAProxy 上进行一些配置?

Is there a prescribed methodology to secure the said websocket endpoint using TLS/SSL when hosted on PCF and running behind the PCF HAProxy?

几件事:

  1. 将应用程序部署到 PCF 时,您不需要配置证书或类似的东西。该平台负责所有这些工作。在您的情况下,它可能由 HAProxy 处理,但它可能是其他负载均衡器甚至 Gorouter,具体取决于您的平台运营团队安装的 PCF。最终结果是 TLS 在到达您的应用程序之前首先终止,因此您无需担心。

  2. 您的应用应始终强制用户使用 HTTPS。如何执行此操作取决于您使用的 language/framework,但大多数都有一些功能。

此过程通常通过检查传入请求是通过 HTTP 还是 HTTPS 来工作。如果它是 HTTP,那么您将重定向到相同的 URL,但通过 HTTPS。这对所有应用程序都很重要,而不仅仅是使用 WebSockets 的应用程序。加密所有东西。

请记住,您在一个或多个反向代理之后,因此如果您手动执行此操作,则需要考虑 x-forwarded-protox-forwarded-port 中的内容,而不仅仅是上游连接将是 Gorouter,而不是您客户端的浏览器。

https://docs.pivotal.io/platform/application-service/2-7/concepts/http-routing.html#http-headers

  1. 如果您强制用户使用 HTTPS(上面的#1),那么您的用户将无法启动与您的应用程序的不安全 WebSocket 连接。 Chrome 和 Firefox 等浏览器具有限制,以防止在通过 HTTPS 加载网站时建立不安全的 WebSocket 连接。

您将在 Firefox 中收到类似 The operation is insecure 或在 Chrome 中收到 Cannot connect: SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS. 的消息。

I am having trouble interpreting this information, as in, are we supposed to expose port 4443 on the server and PCF shall by default pick it up to be a secure port that ensures unsecured connections cannot be established? Or does it require some configuration to be done on HAProxy?

从应用程序的角度来看,您没有做任何不同的事情。您的应用程序应该启动并侦听分配的端口,即 $PORT 中的内容。对于 HTTP、HTTP、WS 和 WSS 流量也是如此。简而言之,作为应用程序开发人员,您在部署到 PCF 时无需考虑这一点。

唯一的例外是您的平台运营团队使用的负载均衡器本身不支持 WebSockets。在这种情况下,要解决这个问题,他们需要分离流量。 HTTP 和 HTTPS 在传统的端口 80 和 443 上运行,它们将在不同的端口上路由 WebSocket。 PCF 文档推荐 4443,您可能会在此处看到该端口。我不能告诉你你的平台是不是这样设置的,但如果你知道你正在使用 HAproxy,它可能不是。

https://docs.pivotal.io/platform/application-service/2-8/adminguide/supporting-websockets.html

无论如何,如果您不知道,只需推送一个应用程序并尝试通过端口 443 启动安全的 WebSocket 连接,看看它是否有效。如果失败,请尝试 4443,看看是否可行。或者询问您的平台运营团队。

就其价值而言,即使您需要使用端口 4443,这与在 PCF 上运行的应用程序没有区别。唯一的区别在于启动 WebSocket 连接的 JavaScript 代码。它需要知道使用端口 4443 而不是默认的 443。