在SSLServer #accept中发生错误时显示客户端IP地址

时间:2018-03-02 04:57:30

标签: ruby ssl

我用ruby制作了一个TCP服务器。版本如下。

  • ruby​​ 2.3.1p112
  • openssl 2.0.4

代码如下。

context             = OpenSSL::SSL::SSLContext.new()
context.cert        = OpenSSL::X509::Certificate.new(File.read(CERT_PATH))
context.key         = OpenSSL::PKey::RSA.new(File.read(KEY_PATH))
context.ca_file     = CERT_PATH
context.ssl_version = :TLSv1_2
tcp_server          = TCPServer.new(PORT)
@ssl_server         = OpenSSL::SSL::SSLServer.new(tcp_server, context)

loop do
  Thread.abort_on_exception = true
  begin
    Thread.start(@ssl_server.accept) do |socket|
      do_something
      socket.close
    end
  rescue => e
    ERROR_LOGGER.error e
    exit
  end
end

基本上它工作正常,但执行@ssl_server.accept时偶尔会出现以下错误。

E, [2018-03-02T11:06:10.142500 #10116] ERROR -- : SSL_accept SYSCALL returned=5 errno=0 state=SSLv3 read client key exchange A (OpenSSL::SSL::SSLError)

我想知道谁正在访问此错误。因此,我想在发生错误时显示访问源的IP地址。请告诉我谁知道怎么做。谢谢!

1 个答案:

答案 0 :(得分:0)

Socket#accept返回套接字描述符和addr_info,因此您可以执行以下操作:

loop do
  Thread.abort_on_exception = true
  begin
    _fd, @addr_info = @ssl_server.accept
    Thread.start(_fd) do |socket|
      do_something
      socket.close
    end
  rescue => e
    ERROR_LOGGER.error e
    ERROR_LOGGER.info "AddrInfo: #{@addr_info}"
    exit
  end
end