使用 stunnel 和 Ratchet 保护 websocket。连接已关闭

Posted

技术标签:

【中文标题】使用 stunnel 和 Ratchet 保护 websocket。连接已关闭【英文标题】:Secure websockets with stunnel and Ratchet. Connection is closed 【发布时间】:2013-12-20 22:37:49 【问题描述】:

我有一个使用 Ratchet 和 ZeroMQ 的有效 websockets 解决方案,如其push integration documentation 中所述。我遇到的问题是生产应用程序是通过 SSL 提供的,当通过安全网站请求时,不安全的 websocket 在 Firefox 中不起作用。这个问题是众所周知的,有两个建议是使用 stunnel,或者使用 nginx 作为 Web 服务器。我不能使用 nginx,所以我唯一的选择是 stunnel,但客户端无法连接。

这是我的 stunnel 配置:

client = no
chroot = /var/lib/stunnel/
setuid = stunnel
setgid = nogroup
pid = /var/run/stunnel.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
cert = /etc/apache2/server.info.crt
key = /etc/apache2/server.info.key

[websocket]
accept = 8079
connect = 8080

Ratchet 配置为在 8080 中侦听:

$webSock = new React\Socket\Server($loop);
$webSock->listen(8080, "0.0.0.0"); // Binding to 0.0.0.0 means remotes can connect
$webServer = new Ratchet\Server\ioserver(
  new Ratchet\Http\HttpServer(
      new Ratchet\WebSocket\WsServer(
          new Ratchet\Wamp\WampServer(
              $pusher
          )
      )
  ),
  $webSock
);

客户端尝试通过wss://server.ip:8079 连接,但是没有客户端可以连接,一旦发出请求,它们就会断开连接。

有什么想法吗?

【问题讨论】:

您是否通过导航到server.ip:8079 授权与浏览器的连接?使用 Chrome 时,我必须在每次清除浏览历史记录后执行此操作。 【参考方案1】:

我也在使用 Ratchet 进行加密时通过 stunnel。我的整个stunnel.conf 看起来像这样。使用与我的 apache httpd 服务器相同的 pem。

cert = /etc/apache2/ssl/cert.pem

[websocket]
accept = YOUR_PUBLIC_IP_ADDRESS:8079
connect = 127.0.0.1:8080

您可能在端口之前缺少 IP 地址。我将密钥和证书合并到一个 pem 中,但两者都可以使用。

【讨论】:

注意,我发现当服务器意外死机时,在使用 stunnel 时,onclose 不会在 Chrome 中触发。在 Chrome 35 中测试。【参考方案2】:

我在 Mac OS 中遇到了同样的问题,但只是通过将证书添加到钥匙串访问解决了这个问题,这样浏览器(Chrome 和 Safari)就会承认证书并建立连接.

【讨论】:

以上是关于使用 stunnel 和 Ratchet 保护 websocket。连接已关闭的主要内容,如果未能解决你的问题,请参考以下文章

Stunnel服务端

Stunnel使用

Stunnel使用2

CentOS 上的 Stunnel 语法?

数据加密:Stunnel

centos上使用squid+stunnel代理上网