gpt4 book ai didi

Ruby openssl SSLContext 密码

转载 作者:行者123 更新时间:2023-12-04 22:40:59 27 4
gpt4 key购买 nike

我使用 OpenSSL 库在 Ruby 中编写了以下代码,该库从 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

最佳答案

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

The new ciphersuites are defined differently and do not specify the certificate type (e.g. RSA, DSA, ECDSA) or the key exchange mechanism (e.g. DHE or ECHDE). This has implications for ciphersuite configuration.


在您的情况下,即使您指定 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 绑定(bind)不支持。

关于Ruby openssl SSLContext 密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63705024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com