Преобразовать код Python sslsocket в ruby - PullRequest
2 голосов
/ 01 сентября 2011

У меня есть такой код на Python для подключения к некоторому программному обеспечению через сокет:

import socket, ssl

host = '127.0.0.1'
port = 8963
sert_key = '../keys/key.pem'

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, True)
sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, True)
sock.settimeout(30.5)
sock.connect((host, port))
sock = ssl.wrap_socket(sock, server_side=True, certfile=sert_key,
ssl_version=ssl.PROTOCOL_TLSv1)


cert = "hello"

cert = cert.encode('utf-8')
req = ('%08x'%len(cert))+cert
sock.sendall(req)
print sock.recv(4096)

Вывод: «ОК», значит, его работа.

Я пытаюсь преобразовать такой код на ruby, но он не работает:

require 'socket'
require 'openssl'

host = '127.0.0.1'
port = 8963
sert_key = '../keys/key.pem'

socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
address = Socket.pack_sockaddr_in(port, host)
socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
socket.setsockopt(Socket::SOL_TCP, Socket::TCP_NODELAY, true)
socket.connect(address)

#socket = TCPSocket.new(host, port) # not help also

ssl_context = OpenSSL::SSL::SSLContext.new(:TLSv1)
ssl_context.cert = OpenSSL::X509::Certificate.new(File.open(sert_key))
ssl_context.key = OpenSSL::PKey::RSA.new(File.open(sert_key))
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context)
ssl_socket.sync_close = true
ssl_socket.connect


sert = "hello"                                                                                                                                                                                            
sert = sert.force_encoding('UTF-8')                                                                                                                                                                        
req = sprintf("%08x", sert.length) + sert                                                                                                                                                                  
ssl_socket.write(req)                                                                                                                                                                                                                                                                                                                                                                                      
puts ssl_socket.read(4096) 

Но у меня есть такая ошибка:

test1.rb: 30: in `connect ': возвращено SSL_connect = 1 errno = 0 состояние = сервер чтения SSLv3 привет B: неверный тип сообщения (OpenSSL :: SSL :: SSLError)

Помогите, пожалуйста, перенести этот код на ruby. Я не понимаю, что я скучаю (где разница в кодах).

P.S. Извините, но программное обеспечение, к которому я хочу подключиться, сейчас не для совместного использования: (

1 Ответ

1 голос
/ 01 сентября 2011

Похоже, вы должны использовать что-то вроде этого:

require 'socket'
require 'openssl'

host = '127.0.0.1'
port = 8963
sert_key = '../keys/key.pem'

socket = TCPSocket.new(host, port) # not help also

ssl_context = OpenSSL::SSL::SSLContext.new(:TLSv1)
ssl_context.cert = OpenSSL::X509::Certificate.new(File.open(sert_key))
ssl_context.key = OpenSSL::PKey::RSA.new(File.open(sert_key))
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context)
ssl_socket.sync_close = true
ssl_socket.accept

sert = "hello"                                                                                                                                                                                            
sert = sert.force_encoding('UTF-8')                                                                                                                                                                        
req = sprintf("%08x", sert.length) + sert                                                                                                                                                                  
ssl_socket.write(req)
puts ssl_socket.sysread(4096)

РЕДАКТИРОВАТЬ: Обновлен код еще раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...