gpt4 book ai didi

ruby - 如何从 OpenSSL::X509::Request 获取属性?

转载 作者:太空宇宙 更新时间:2023-11-03 16:15:22 25 4
gpt4 key购买 nike

有一些教程展示了如何向证书签名请求 (CSR) 添加属性(例如 subjectAltName 扩展)。例如,这是我在创建 CSR 时枚举有效别名的方式:

aliases.each do |a|
alist << ("DNS:#{a}")
alist << ("IP:#{a}") if IPAddress.valid? a
end

extension = OpenSSL::X509::ExtensionFactory.new.create_extension(
'subjectAltName',
alist.join(', '),
false
)
csr.add_attribute OpenSSL::X509::Attribute.new(
'extReq',
OpenSSL::ASN1::Set.new(
[OpenSSL::ASN1::Sequence.new([extension])]
)
)

但是,假设我想从一个已经存在的 CSR 中读取任何这样的属性(比如从磁盘读取的东西)?没有get_attribute方法...有没有直接获取原始列表的方法(比如DNS:meow,DNS:127.0.0.1,IP:127.0.0.1 ) 来自 Request 对象?

最佳答案

好的,这就是我现在的做法——在 Ruby 的 openssl/ssl.rb 中找到一些代码之后:

def getAliases(csr) 
attributes = csr.attributes
return nil if not attributes

seq = nil
values = nil

attributes.each do |a|
if a.oid == 'extReq'
seq = a.value
break
end
end
return nil if not seq

seq.value.each do |v|
v.each do |v|
if v.value[0].value == 'subjectAltName'
values = v.value[1].value
break
end
break if values
end
end
return nil if not values

values = OpenSSL::ASN1.decode(values).value

result = []
values.each do |v|
case v.tag
when 2
result << "DNS:#{v.value}"
when 7
case v.value.size
when 4
ip = v.value.unpack('C*').join('.')
when 16
ip = v.value.unpack('n*').map { |o| sprintf("%X", o) }.join(':')
else
STDERR.print "The encountered IP-address is neither IPv4 nor IPv6\n"
next
end
result << "IP:#{ip}"
else
STDERR.print "Uknown tag #{v.tag} -- I only know 2 (DNS) and 7 (IP)\n"
end
end
return result
end

但是,我不喜欢它,因为它应该可以从 csr 获得整个现成的扩展(按名称)并将其添加到 cert 逐字记录——没有解码(即使我曾经让它变得完美)和重新编码。

关于ruby - 如何从 OpenSSL::X509::Request 获取属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46494429/

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