【问题标题】:STARTTLS connection with Ruby and OpenSSL与 Ruby 和 OpenSSL 的 STARTTLS 连接
【发布时间】:2018-05-16 13:38:49
【问题描述】:

在命令行上使用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

【问题讨论】:

    标签: ruby ssl openssl starttls


    【解决方案1】:

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

    如果您在发送STLS 之前调用connect,服务器将不知道发生了什么,并将其解释为垃圾输入。

    工作示例:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2013-01-16
      • 2014-01-18
      • 1970-01-01
      • 2017-01-11
      相关资源
      最近更新 更多