STARTTLS соединение с Ruby и OpenSSL - PullRequest
0 голосов
/ 16 мая 2018

Используя openssl s_client в командной строке, я могу установить соединение с сервером POP3, для которого требуется STARTTLS.

openssl s_client -connect pop3.example.com:110 -starttls pop3

Как я могу сделать то же самое (особенно часть -starttls pop), используя библиотеку Ruby OpenSSL:

tcp_socket = TCPSocket.new host, port
ssl_context = OpenSSL::SSL::SSLContext.new
ssl_client = OpenSSL::SSL::SSLSocket.new tcp_socket, ssl_context
ssl_client.connect

1 Ответ

0 голосов
/ 16 мая 2018

В спецификации POP3 говорится, что вам необходимо отправить STLS, чтобы инициировать квитирование TLS.Поэтому сначала вы должны отправить STLS на незашифрованный сокет, а после этого вы сможете вызвать connect на уровне OpenSSL, который затем выполнит фактическое рукопожатие.

Если вы позвоните connect перед отправкой STLS, сервер не будет знать, что происходит, и будет интерпретировать его как ввод мусора.

Рабочий пример:

tcp = TCPSocket.new(host, port)

puts tcp.gets
tcp.puts 'STLS'
puts tcp.gets

ssl_context = OpenSSL::SSL::SSLContext.new
ssl_client  = OpenSSL::SSL::SSLSocket.new(tcp, ssl_context)

ssl_client.connect
puts ssl_client.state

ssl_client.puts "NOOP"
puts ssl_client.gets

Вывод:

+OK POP3 ready <2067986403.1526483285@....>
+OK
SSLOK
+OK
...