【问题标题】:How to get an attribute from OpenSSL::X509::Request?如何从 OpenSSL::X509::Request 获取属性?
【发布时间】:2017-09-29 17:52:06
【问题描述】:

那里有教程显示,如何将属性(例如subjectAltName-extension)添加到证书签名请求 (CSR)。例如,这是我在创建 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方法……有没有直接从Request-object获取原始列表(如DNS:meow, DNS:127.0.0.1, IP:127.0.0.1)的方法?

【问题讨论】:

    标签: ruby openssl csr


    【解决方案1】:

    好的,这就是我现在的做法——在 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 -- 无需解码(即使我曾经使它完美)和重新编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多