2017-09-29 33 views
1

有教程顯示,如何將一個屬性(如subjectAltName-擴展)添加到證書籤名請求(CSR)。例如,我這是怎麼枚舉有效的別名,創建CSR時:如何從OpenSSL :: X509 :: Request獲取屬性?

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對象中獲取原始列表(例如DNS:meow, DNS:127.0.0.1, IP:127.0.0.1)?

回答

0

好吧,這就是我要做的事,現在 - 發現在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逐字 - 沒有解碼(即使我曾經使它完美)和重新編碼。