2015-04-22 2 views
0

Как я могу сделать безопасное (TLS) соединение с клиентом websocket с помощью Faye-websocket в Ruby?защищенный клиент Websocket в ruby ​​

Я использую 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 
    } 
+1

Вы запрашиваете 'wss', так вы его получаете? – tadman

+1

Нет, напишите сейчас, я получаю: - завершение вызова после вызова экземпляра 'std :: runtime_error' what(): Шифрование недоступно на этой event-машине Это приложение попросило Runtime прекратить его в необычном путь. Для получения дополнительной информации обратитесь в службу поддержки приложения. –

+0

У меня есть сервер websocket, который позволяет только безопасные соединения. –

ответ

0

EDIT 2018:

Этот ответ является устаревшим.

Сервер Iodine был переписан как расширение C, и ни один клиент Websocket, ни уровень SSL/TLS не были реализованы в Ruby, пока (туннелирование SSL/TLS в настоящее время является рекомендуемым способом получения шифрования).


Вы можете использовать, вероятно, использовать Iodine's websocket client, если это простое соединение (вы можете добавить параметры запроса, куки и заголовки запроса, если вы нуждаетесь в них) ... Fair уведомление, я автор йодом драгоценный камень.

Это должно быть просто:

# 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 ... Так что я надеюсь, что это поможет.

EDIT Этот ответ редактировался с тех пор, как Йод унаследовал кодовую базу GRHttp и находится в активной разработке, тогда как GRHttp больше не находится в активной разработке.