2017-09-29 9 views
1

CSR (Certificate Sign Request)에 속성 (예 : subjectAltName -extension)을 추가하는 방법을 보여주는 튜토리얼이 나와 있습니다. 예를 들어, 내가 유효한 별칭을 열거 어떻게하는 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의 이러한 속성을 읽을 수있는 I (예 : 디스크에서 읽을 무언가로)한다고 가정? get_attribute 메서드가 없습니다 ... Request- 개체에서 원래 목록 (예 : DNS:meow, DNS:127.0.0.1, IP:127.0.0.1)을 가져 오는 간단한 방법이 있습니까?

답변

0

좋아, 이것이 내가 지금 그것을 할 방법입니다 - 루비의 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 축 어적으로 추가하십시오. 디코딩 없이도 (완벽하더라도) 다시 인코딩하십시오.