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

标签 ruby openssl csr

有一些教程展示了如何向证书签名请求 (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/

相关文章:

ios - 使用 RubyMotion 解析 JSON

ruby - 为什么我不能用 yum 安装最新版本的 ruby​​?

ruby-on-rails - 在 Ruby 中,如何正确读取基准测试的结果?

openssl - 如何创建自己的自签名根证书和中间 CA 以导入 Java keystore ?

ssl - 在 Go 中使用电子邮件地址创建证书签名请求 (CSR)

ruby - 数字范围到数字字符串数组?

编码/配置 OpenSSL 服务器以获得最大兼容性

c++ - 使用 openssl 在 C++ 中验证 RSA 签名

iphone - 保存证书签名请求以供多次使用是否安全?

java - 在 Android 上创建 PKCS10CertificationRequest