Project

General

Profile

Download (1.08 KB) Statistics
| Branch: | Tag: | Revision:
require 'openssl'

class CertificateExtract
def initialize(cert_raw)
@certificate = OpenSSL::X509::Certificate.new(cert_raw)
end

def subject
@subject ||= @certificate.subject.to_s[/CN=([^\s\/,]+)/i, 1]
end

def subject_alternative_names
@subject_alternative_names || begin
@subject_alternative_names = []
if subject_alt_name_extension
_id, ostr = OpenSSL::ASN1.decode(subject_alt_name_extension).value
sequence = OpenSSL::ASN1.decode(ostr.value)
sequence.value.each do |san|
@subject_alternative_names << san.value if san.tag == 2 # dNSName in RFC5280
if san.tag == 7 # iPAddress in RFC5280
@subject_alternative_names << san.value.unpack('C*').join('.') if san.value.size == 4 # IPv4
@subject_alternative_names << san.value.unpack('n*').map { |e| sprintf("%X", e) }.join(':') if san.value.size == 16 # IPv6
end
end
end
@subject_alternative_names
end
end

def subject_alt_name_extension
@certificate.extensions.find {|e| e.oid == "subjectAltName"}
end
end
(6-6/42)