【问题标题】:SNI in TCPServer with SSLContext in RubyTCPServer 中的 SNI 与 Ruby 中的 SSLContext
【发布时间】:2023-02-17 17:28:45
【问题描述】:

我想用 Ruby 编写一个简单的服务器,它根据主机名返回不同的 TLS 证书。 目前我这样做是为了指定一个带有 SSLContext 的 TCPServer 并提供 SSLContext 证书和密钥。然后,无论主机名如何,此证书都将用于所有连接。

context = OpenSSL::SSL::SSLContext.new

context.min_version = :TLS1_2
context.add_certificate cert, key

serv = TCPServer.new host, port
secure = OpenSSL::SSL::SSLServer.new(serv, context)

Thread.new(secure.accept) do |conn|
  # do stuff
end

因此,应根据 SNI 发送不同的证书。如何实施?

【问题讨论】:

    标签: ruby tcpserver sni sslcontext


    【解决方案1】:

    你可以使用servername_cb

    context.servername_cb = lambda do |_, name|
      ctx = OpenSSL::SSL::SSLContext.new
    
      # load certificate for name
    
      ctx.add_certificate cert[0], cert[1]
            
      return ctx
    end
    

    或者,您可以使用已经存在的上下文:

    context.servername_cb = lambda do |socket, name|
      ctx = socket.context
    
      # load certificate for name
    
      ctx.add_certificate cert[0], cert[1]
            
      return ctx
    end
    

    在 TLS 握手期间调用 servername_cb 的函数。它传递一个 SSLSocket 和名称作为参数。预计会返回带有相应证书的 SSLContext。 https://ruby-doc.org/3.1.2/exts/openssl/OpenSSL/SSL/SSLContext.html#attribute-i-servername_cb

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多