ruby 中的安全 Websocket 客户端

Posted

技术标签:

【中文标题】ruby 中的安全 Websocket 客户端【英文标题】:secure Websocket client in ruby 【发布时间】:2015-04-22 15:09:39 【问题描述】:

如何在 Ruby 中使用 Faye-websocket 建立安全 (TLS) websocket 客户端连接?

我在我的脚本中使用 faye/websocket gem。

    require 'faye/websocket'
    require 'eventmachine'

    EM.run 
      ws = Faye::WebSocket::Client.new('wss://aws.com/gateway',:ssl => 
    :private_key_file => 'path/to/ssl.key',
    :cert_chain_file  => 'path/to/ssl.crt'
  , :headers =>  'Authorization' => 'Basic bXl1c2VyOm15cGFzc3dvcmQ=')

      ws.on :open do |event|
        p [:open]
        ws.send('Hello, world!')
      end

      ws.on :message do |event|
        p [:message, event.data]
      end

      ws.on :close do |event|
        p [:close, event.code, event.reason]
        ws = nil
      end
    

【问题讨论】:

你要wss,你明白了吗? 不,现在写我得到: - 在抛出一个 'std::runtime_error' 实例后调用终止 what(): 在这个事件机器上加密不可用这个应用程序已经请求运行时终止它以一种不寻常的方式。请联系应用程序的支持团队了解更多信息。 我有工作的 websocket 服务器,它只允许安全连接。 【参考方案1】:

2018 年编辑

这个答案已经过时了。

碘服务器被重写为 C 扩展,Websocket 客户端和 SSL/TLS 层都尚未在 Ruby 中实现(目前推荐使用 SSL/TLS 隧道来实现加密)。


如果它是一个简单的连接,您可以使用大概使用Iodine's websocket client(如果需要,您可以在请求中添加查询参数、cookie 和标头)...请注意,我是 Iodine gem 的作者。

应该很简单:

# load the Http extension which includes a websocket client and server
require 'iodine/http'
# As long as Iodine.protocol isn't a Class, Iodine will only perform tasks
Iodine.protocol = :timers

# We will use this as our 'on_open' callback.
on_open_proc = Proc.new do
     puts 'Connection opened'
     # `#write` is defined in the WebsocketClient
     # This Proc runs within the instance's context.
     # It's like defining a method in a subclass.
     write 'Hello World!'
end
# We will use this as our 'on_message(data)' callback.
on_message_proc = Proc.new |data| puts data 
# We will use this as our 'on_close' callback.
# It's only called if the connection isn't automatically renewed.
# In our case, unless the server shuts down, it won't be called.
on_close_proc = Proc.new  puts "Connection wasn't renewed..." 
# We will use this for "polling" data.
on_timer_proc = Proc.new  write "The time is #Time.now" 

# test client:
Iodine::Http.ws_connect 'wss://echo.websocket.org',
       on_message: on_message_proc,
       on_open: on_open_proc,
       on_close: on_close_proc,
       every: 5, send: on_timer_proc,
       renew: 5,
       cookies: 'my_cookie' => 'value of my cookie' #,
       # ssl_key: 'key_data', ssl_cert: 'cert_data'

# If you are running Iodine within irb, use `exit`:
exit 

# If you are running Iodine within an existing server application,
# you will have to force it to start while your script is running:
# Iodine.force_start!

websocket 回显服务器在 SSL 上回答我......所以我希望这会对你有所帮助。

编辑此答案已编辑,因为 Iodine 继承了 GRHttp 的代码库并处于积极开发中,而 GRHttp 不再处于积极开发中。

【讨论】:

以上是关于ruby 中的安全 Websocket 客户端的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 faye-websocket-ruby 向 websocket 客户端发送拒绝连接

Windows 服务中的安全 Websocket 客户端在发送期间超时

如何在 ruby​​ on rails 中通过 websocket 发送保持活动的数据包

Jetty websocket 客户端类 WebSocketClient 线程安全吗?

javascript客户端和netty服务器之间的安全websocket连接

验证 stomp Web 套接字客户端