首页
学习
活动
专区
圈层
工具
发布

Ruby密码
EN

Stack Overflow用户
提问于 2020-09-02 11:56:54
回答 1查看 363关注 0票数 1

我用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执行。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-02 17:35:45

TLS1.3改变了密匙被破坏的方式。来自OpenSSL维基

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

在您的示例中,即使您指定了aRSA,OpenSSL仍然包含1.3个密码,它将与EC证书一起工作。

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

代码语言:javascript
复制
ctx.max_version = :TLS1_2
ctx.ciphers = 'aRSA'

这将使Cloudflare使用RSA证书。

我认为在TL1.3中指定不需要ECDSA证书的正确方法是在请求中使用signature_algorithms扩展字段,但是OpenSSL绑定不支持这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63705024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档