在开发环境中使用 SSL/TLS 的 Rails 和 WebSockets

Posted

技术标签:

【中文标题】在开发环境中使用 SSL/TLS 的 Rails 和 WebSockets【英文标题】:Rails and WebSockets using SSL/TLS in development environment 【发布时间】:2018-07-03 09:50:11 【问题描述】:

我有一个使用 ActionCable 的 Rails 4.2.x 应用程序。

目标

在使用Devise FIDO U2F gem 时,我不得不从 HTTP 切换到 HTTPS。 所有应用程序都运行良好,我的(自签名)证书在 Chrome 中有效(绿色锁图标)并通过 当使用此证书时 来自 Trust 的 KeyChain Access 中始终信任

我正在将正在侦听 ws://my.app.eu:28080 的 WebSocket 迁移到 wss://my.app.eu:28080

问题

我使用Puma 来运行ActionCable 服务器,但我发现Puma 使用eventmachine、which isn't compatible。 从这里开始,我 migrated ActionCable server to thin 但永远无法正常工作。

我不知道来自 Chrome 控制台的错误消息:

WebSocket connection to 'wss://my.app.eu:28080/' failed: WebSocket opening handshake was canceled

奇怪的事情

我还不知道为什么以及如何,但它发生了两次,它突然在 Chome 中工作(没有更多错误并且看到通过 ActionCable 到达 Chrome 的消息)但就像某些东西被解锁了。

我的意思是应用程序在订阅队列时正在记录,当它突然工作时,我在应用程序的日志文件中看到了这些日志。

问题

如果它正常工作,我会错过什么? 有没有办法查看卡在哪里? 你知道一个地方解释了如何让 Rails 开发环境通过 SSL 与 WebSockets 一起工作吗?

【问题讨论】:

如果您可以使用 nginx 将 SSL/TLS 请求路由到 cleantext 应用程序,那可能会更好。生产环境通常使用这种设计和框架支持(以及应用程序服务器支持),SSL/TLS 通常低于 nginx 提供的安全性。你也可以试试 iodine HTTP/Websocket 服务器。除了支持 ActionCable 的劫持之外,您还可以使用通常更快的原生 websocket 和 pub/sub 支持(我是作者,我有偏见)。 iodine 假设 SSL/TLS 由代理(nginx / apache)处理,类似于生产环境。 P.S.从您链接到的问题中,我看到 Puma 版本 3.9.0 及更高版本已解决该问题。您是否尝试将 Puma gem 更新到最新版本? 我不确定修复是否与 Puma 有关(老实说,我没有阅读整个问题......)。我们正在使用 Puma 2.x,所以让我们尝试更新它:) 谢谢@Myst 刚刚尝试使用 Puma 3.11.2 但我遇到了与升级前相同的错误:Error raised inside the event loop: no implicit conversion of Puma::MiniSSL::Socket into Integer :( @ZedTuX 你有解决 Puma::MiniSSL::Socket 到 Integer 的问题吗? 【参考方案1】:

解决方案是访问https://my.app.eu:28080/ 并接受证书,然后 WSS 连接正常。

【讨论】:

以上是关于在开发环境中使用 SSL/TLS 的 Rails 和 WebSockets的主要内容,如果未能解决你的问题,请参考以下文章

请求中止无法创建 SSL/TLS 安全通道 - HttpWebRequest

请求被中止:无法为 HttpWebRequest 创建 SSL/TLS 安全通道

SSL/TLS协议运行机制的概述

SSL/TLS 握手优化详解

无法创建 SSL/TLS 安全通道。 (SSIS)

SSL/TLS 握手中出现问题