21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/utils/utils.rb', line 21
def parse_csr_fields(csr)
LOG.info("#{Vcert::VCERT_PREFIX} Trying to parse CSR:\n#{csr}")
csr_obj = OpenSSL::X509::Request.new(csr)
result = Hash.new
subject_array = csr_obj.subject.to_a
subject_array.map do |x|
if x[1] != ""
result[x[0].to_sym] = x[1]
end
end
attributes = csr_obj.attributes
seq = nil
values = nil
if attributes
attributes.each do |a|
if a.oid == 'extReq'
seq = a.value
break
end
end
end
if 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
end
if values
values = OpenSSL::ASN1.decode(values).value
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
end
if csr_obj.public_key.instance_of? OpenSSL::PKey::RSA
result[:key_type] = Vcert::KeyType.new "rsa", csr_obj.public_key.n.num_bits
elsif csr_obj.public_key.instance_of? OpenSSL::PKey::EC
raise "not implemented"
else
raise Vcert::VcertError
end
LOG.info("#{Vcert::VCERT_PREFIX} Parsed CSR fields:\n #{result.inspect}")
return result
end
|