STARTTLS与Ruby和OpenSSL的连接

时间:2018-05-16 13:38:50

标签: ruby ssl openssl starttls

在命令行上使用openssl s_client我可以建立一个需要STARTTLS的POP3服务器。

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

如何利用Ruby的OpenSSL库完成相同的工作(尤其是-starttls pop部分):

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 :(得分:2)

POP3规范声明您需要发送STLS才能启动TLS握手。因此,您应首先在未加密的套接字上发送STLS,之后您应该能够在OpenSSL层上调用connect,然后执行实际的握手。

如果在发送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