class Inspec::Resources::X509CertificateResource
def certificate?
def certificate? !@cert.nil? end
def extensions
def extensions # Return cached Mash if we already parsed the certificate extensions return @extensions if @extensions # Return the exception class if we failed to instantiate a Cert from file return @cert unless @cert.respond_to? :extensions # Use a Mash to make it easier to access hash elements in "its('entensions') {should ...}" @extensions = Hashie::Mash.new({}) # Make sure standard extensions exist so we don't get nil for nil:NilClass # when the user tests for extensions which aren't present %w{ keyUsage extendedKeyUsage basicConstraints subjectKeyIdentifier authorityKeyIdentifier subjectAltName issuerAltName authorityInfoAccess crlDistributionPoints issuingDistributionPoint certificatePolicies policyConstraints nameConstraints noCheck tlsfeature nsComment }.each { |extension| @extensions[extension] ||= [] } # Now parse the extensions into the Mash extension_array = @cert.extensions.map(&:to_s) extension_array.each do |extension| kv = extension.split(/ *= */, 2) @extensions[kv.first] = kv.last.split(/ *, */) end @extensions end
def fingerprint
def fingerprint return if @cert.nil? OpenSSL::Digest::SHA1.new(@cert.to_der).to_s end
def initialize(filename)
- See:  https://tools.ietf.org/html/rfc5280#page-23 -   
def initialize(filename) @certpath = filename @issuer = nil @parsed_subject = nil @parsed_issuer = nil @extensions = nil @cert = OpenSSL::X509::Certificate.new read_file_content(@certpath) end
def issuer
def issuer return if @cert.nil? # Return cached subject if we have already parsed it return @parsed_issuer if @parsed_issuer # Use a Mash to make it easier to access hash elements in "its('issuer') {should ...}" @parsed_issuer = Hashie::Mash.new(Hash[@cert.issuer.to_a.map { |k, v, _| [k, v] }]) end
def issuer_dn
def issuer_dn return if @cert.nil? @cert.issuer.to_s end
def key_length
def key_length return if @cert.nil? @cert.public_key.n.num_bytes * 8 end
def serial
def serial return if @cert.nil? @cert.serial.to_i end
def subject
def subject return if @cert.nil? # Return cached subject if we have already parsed it return @parsed_subject if @parsed_subject # Use a Mash to make it easier to access hash elements in "its('subject') {should ...}" @parsed_subject = Hashie::Mash.new(Hash[@cert.subject.to_a.map { |k, v, _| [k, v] }]) end
def subject_dn
def subject_dn return if @cert.nil? @cert.subject.to_s end
def to_s
def to_s "x509_certificate #{@certpath}" end
def valid?
def valid? now = Time.now certificate? && (now >= not_before && now <= not_after) end
def validity_in_days
def validity_in_days (not_after - Time.now.utc) / 86400 end