【问题标题】:Ruby openssl SSLContext cipherRuby openssl SSLContext 密码
【发布时间】:2020-09-02 11:56:54
【问题描述】:

我在 Ruby 中使用 OpenSSL 库编写了以下代码,该库从 cloudflare.com 获取证书链。但是 Cloudflare 有一个混合系统,旧浏览器接收 RSA 证书,新客户端接收 ECDSA 证书(请参阅https://www.ssllabs.com/ssltest/analyze.html?d=cloudflare.com&s=104.17.176.85)。 就我而言,我想获得较旧的 RSA 证书,这就是我设置ctx.ciphers = 'aRSA' 的原因。但不知何故,我总是收到 ECDSA 证书。 以下命令通过 openssl s_client -cipher aRSA -connect cloudflare.com:443 -showcerts 起作用。

require 'openssl'

ctx = OpenSSL::SSL::SSLContext.new
ctx.ciphers = 'aRSA'
sock = Socket.tcp("https://www.cloudflare.com", 443, connect_timeout: 10)
connection = connect(sock, ctx, hostname)
connection.peer_cert_chain

def connect(sock, ctx, url)
   ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
   ssl.hostname = url
   begin
      ssl.connect_nonblock
   rescue IO::WaitReadable
      return nil unless IO.select([ssl], nil, nil, 10)

      retry
   rescue IO::WaitWritable
      return nil unless IO.select(nil, [ssl], nil, 10)

      retry
   end
   ssl
end

谢谢

Ruby 版本:2.6.3 Ruby OpenSSL 版本:2.2.0 OpenSSL 版本:LibreSSL 2.8.3

【问题讨论】:

    标签: ruby ssl openssl ssl-certificate


    【解决方案1】:

    TLS 1.3 改变了密码套件的定义方式。来自OpenSSL Wiki

    新密码套件的定义不同,没有指定证书类型(例如 RSA、DSA、ECDSA)或密钥交换机制(例如 DHE 或 ECHDE)。这对密码套件配置有影响。

    在您的情况下,即使您指定 aRSA,OpenSSL 仍然包含 1.3 密码,它将与 EC 证书一起使用。

    我不知道是否可以指定密码列表来排除这些密码(我无法让它工作),但您可以简单地将最高版本设置为 1.2:

    ctx.max_version = :TLS1_2
    ctx.ciphers = 'aRSA'
    

    这应该让 Cloudflare 使用 RSA 证书。

    我认为在 TLS 1.3 中指定您不需要 ECDSA 证书的正确方法是在请求中使用 signature_algorithms 扩展字段,但 Ruby 的 OpenSSL 绑定不支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      相关资源
      最近更新 更多