Class: Ronin::Support::Crypto::Cert
- Inherits:
-
OpenSSL::X509::Certificate
- Object
- OpenSSL::X509::Certificate
- Ronin::Support::Crypto::Cert
- Defined in:
- lib/ronin/support/crypto/cert.rb
Overview
Represents a X509 or TLS certificate.
Defined Under Namespace
Classes: Name
Constant Summary collapse
- ONE_YEAR =
One year in seconds
60 * 60 * 24 * 365
Class Method Summary collapse
-
.generate(version: 2, serial: 0, not_before: Time.now, not_after: not_before + ONE_YEAR, subject: nil, extensions: nil, key:, ca_cert: nil, ca_key: nil, signing_hash: :sha256) ⇒ Cert
Generates and signs a new certificate.
-
.load(buffer) ⇒ Cert
Parses the PEM encoded certificate.
-
.load_file(path) ⇒ Cert
Loads the certificate from the file.
-
.Name(name) ⇒ Cert::Name
Coerces a value into a Name object.
-
.parse(string) ⇒ Cert
Parses the PEM encoded certificate string.
Instance Method Summary collapse
-
#common_name ⇒ String?
The subjects common name (
CN) entry. -
#extension_names ⇒ Array<String>
The extension OID names.
-
#extension_value(oid) ⇒ String?
Gets the value for the extension with the matching OID.
-
#extensions_hash ⇒ Hash{String => OpenSSL::X509::Extension}
Converts the certificate's extensions into a Hash.
-
#issuer ⇒ Name?
The issuer of the certificate.
-
#save(path, encoding: :pem) ⇒ Object
Saves the certificate to the given path.
-
#subject ⇒ Name?
The subject of the certificate.
-
#subject_alt_name ⇒ String?
Retrieves the
subjectAltNameextension and parses it's contents. -
#subject_alt_names ⇒ Array<String>?
Retrieves the
subjectAltNameextension and parses it's value.
Class Method Details
.generate(version: 2, serial: 0, not_before: Time.now, not_after: not_before + ONE_YEAR, subject: nil, extensions: nil, key:, ca_cert: nil, ca_key: nil, signing_hash: :sha256) ⇒ Cert
Generates and signs a new certificate.
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 |
# File 'lib/ronin/support/crypto/cert.rb', line 326 def self.generate(version: 2, serial: 0, not_before: Time.now, not_after: not_before + ONE_YEAR, subject: nil, extensions: nil, # signing arguments key: , ca_cert: nil, ca_key: nil, signing_hash: :sha256) cert = new cert.version = version cert.serial = if ca_cert then ca_cert.serial + 1 else serial end cert.not_before = not_before cert.not_after = not_after cert.public_key = key.public_key cert.subject = Name(subject) if subject cert.issuer = if ca_cert then ca_cert.subject else cert.subject end if extensions extension_factory = OpenSSL::X509::ExtensionFactory.new extension_factory.subject_certificate = cert extension_factory.issuer_certificate = ca_cert || cert extensions.each do |name,(value,critical)| ext = extension_factory.create_extension(name,value,critical) cert.add_extension(ext) end end signing_key = ca_key || key signing_digest = OpenSSL::Digest.const_get(signing_hash.upcase).new cert.sign(signing_key,signing_digest) return cert end |
.load(buffer) ⇒ Cert
Parses the PEM encoded certificate.
206 207 208 |
# File 'lib/ronin/support/crypto/cert.rb', line 206 def self.load(buffer) new(buffer) end |
.load_file(path) ⇒ Cert
Loads the certificate from the file.
219 220 221 |
# File 'lib/ronin/support/crypto/cert.rb', line 219 def self.load_file(path) new(File.read(path)) end |
.Name(name) ⇒ Cert::Name
Coerces a value into a Name object.
171 172 173 174 175 176 177 178 179 180 181 182 |
# File 'lib/ronin/support/crypto/cert.rb', line 171 def self.Name(name) case name when String then Name.parse(name) when Hash then Name.build(**name) when OpenSSL::X509::Name new_name = Name.allocate new_name.send(:initialize_copy,name) new_name else raise(ArgumentError,"value must be either a String, Hash, or a OpenSSL::X509::Name object: #{name.inspect}") end end |
.parse(string) ⇒ Cert
Parses the PEM encoded certificate string.
193 194 195 |
# File 'lib/ronin/support/crypto/cert.rb', line 193 def self.parse(string) new(string) end |
Instance Method Details
#common_name ⇒ String?
The subjects common name (CN) entry.
398 399 400 401 402 |
# File 'lib/ronin/support/crypto/cert.rb', line 398 def common_name if (subject = self.subject) subject.common_name end end |
#extension_names ⇒ Array<String>
The extension OID names.
409 410 411 |
# File 'lib/ronin/support/crypto/cert.rb', line 409 def extension_names extensions.map(&:oid) end |
#extension_value(oid) ⇒ String?
Gets the value for the extension with the matching OID.
432 433 434 435 436 |
# File 'lib/ronin/support/crypto/cert.rb', line 432 def extension_value(oid) if (ext = find_extension(oid)) ext.value end end |
#extensions_hash ⇒ Hash{String => OpenSSL::X509::Extension}
Converts the certificate's extensions into a Hash.
419 420 421 |
# File 'lib/ronin/support/crypto/cert.rb', line 419 def extensions_hash extensions.to_h { |ext| [ext.oid, ext] } end |
#issuer ⇒ Name?
The issuer of the certificate.
376 377 378 379 380 |
# File 'lib/ronin/support/crypto/cert.rb', line 376 def issuer @issuer ||= if (issuer = super) Cert::Name(issuer) end end |
#save(path, encoding: :pem) ⇒ Object
Saves the certificate to the given path.
478 479 480 481 482 483 484 485 486 487 |
# File 'lib/ronin/support/crypto/cert.rb', line 478 def save(path, encoding: :pem) exported = case encoding when :pem then to_pem when :der then to_der else raise(ArgumentError,"encoding: keyword argument (#{encoding.inspect}) must be either :pem or :der") end File.write(path,exported) end |
#subject ⇒ Name?
The subject of the certificate.
387 388 389 390 391 |
# File 'lib/ronin/support/crypto/cert.rb', line 387 def subject @subject ||= if (subject = super) Cert::Name(subject) end end |
#subject_alt_name ⇒ String?
Retrieves the subjectAltName extension and parses it's contents.
445 446 447 |
# File 'lib/ronin/support/crypto/cert.rb', line 445 def subject_alt_name extension_value('subjectAltName') end |