openssl-extensions 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/openssl-extensions.rb +3 -0
- data/lib/openssl-extensions/all.rb +1 -0
- data/lib/openssl-extensions/version.rb +1 -1
- data/lib/openssl-extensions/x509/authority_key_identifier.rb +6 -1
- data/lib/openssl-extensions/x509/certificate.rb +33 -0
- data/lib/openssl-extensions/x509/certificate_chain.rb +44 -0
- data/lib/openssl-extensions/x509/name.rb +7 -0
- metadata +4 -3
data/lib/openssl-extensions.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
require 'openssl-extensions/x509'
|
2
2
|
|
3
|
+
##
|
4
|
+
# Returned with requesting an OpenSSLExtensions::X509::Certificate.authority_key_identifier.
|
5
|
+
# If available, this collects the issuer_name (issuer's common name),
|
6
|
+
# serial_number, and key_id (fingerprint).
|
7
|
+
#
|
3
8
|
class OpenSSLExtensions::X509::AuthorityKeyIdentifier
|
4
9
|
|
5
10
|
attr_reader :issuer_name, :serial_number, :key_id
|
6
11
|
alias :serial :serial_number
|
7
12
|
|
8
13
|
def initialize(extension_string)
|
9
|
-
parse(extension_string.dup)
|
14
|
+
parse(extension_string.dup) if extension_string
|
10
15
|
end
|
11
16
|
|
12
17
|
def parse(string)
|
@@ -1,12 +1,16 @@
|
|
1
1
|
require 'openssl-extensions/x509'
|
2
2
|
require 'openssl-extensions/x509/authority_key_identifier'
|
3
3
|
|
4
|
+
##
|
5
|
+
# Extends OpenSSL::X509::Certificate with shortcut methods.
|
6
|
+
#
|
4
7
|
module OpenSSLExtensions::X509::Certificate
|
5
8
|
|
6
9
|
def subject_alternative_names
|
7
10
|
names_string = read_extension_by_oid('subjectAltName')
|
8
11
|
names_string ? names_string.scan(%r{DNS:([^,]+)}).flatten : []
|
9
12
|
end
|
13
|
+
alias :sans :subject_alternative_names
|
10
14
|
|
11
15
|
def subject_key_identifier
|
12
16
|
read_extension_by_oid('subjectKeyIdentifier')
|
@@ -21,6 +25,35 @@ module OpenSSLExtensions::X509::Certificate
|
|
21
25
|
end
|
22
26
|
protected :read_extension_by_oid
|
23
27
|
|
28
|
+
##
|
29
|
+
# Returns +true+ if this certificate is authorized to sign for other certificates (useful for determining CA roots
|
30
|
+
# and intermediary certificates).
|
31
|
+
#
|
32
|
+
def allows_certificate_signing?
|
33
|
+
usage = read_extension_by_oid('keyUsage')
|
34
|
+
usage.nil? || !!(usage.match(%r{\bCertificate Sign\b}))
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Returns +true+ if the certificate given is the issuer certificate for this certificate.
|
39
|
+
#
|
40
|
+
def issuing_certificate?(issuer)
|
41
|
+
(self.authority_key_identifier.key_id &&
|
42
|
+
issuer.subject_key_identifier &&
|
43
|
+
self.authority_key_identifier.key_id == issuer.subject_key_identifier) ||
|
44
|
+
(!self.authority_key_identifier.key_id &&
|
45
|
+
self.issuer.common_name == issuer.subject.common_name &&
|
46
|
+
self.issuer.country == issuer.subject.country &&
|
47
|
+
self.issuer.organization == issuer.subject.organization)
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# Equality is tested by comparing the generated PEM signatures.
|
52
|
+
#
|
53
|
+
def ==(other)
|
54
|
+
to_pem == other.to_pem
|
55
|
+
end
|
56
|
+
|
24
57
|
end
|
25
58
|
|
26
59
|
OpenSSL::X509::Certificate.send(:include, OpenSSLExtensions::X509::Certificate)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'openssl-extensions/x509'
|
2
|
+
require 'openssl-extensions/x509/certificate'
|
3
|
+
|
4
|
+
##
|
5
|
+
# Provides a thin wrapper to an Array which contains the full certificate
|
6
|
+
# chain. This array, however, has been reorganized to be in the proper
|
7
|
+
# order for the chain as follows:
|
8
|
+
#
|
9
|
+
# [Site Certificate, Intermediary #1, ..., CA Root]
|
10
|
+
#
|
11
|
+
# Where +Intermediary #1+ is the issuing certificate of the
|
12
|
+
# +Site Certificate+, followed by +#2+ which issued +#1+, down to the
|
13
|
+
# final root signing certificate in last position.
|
14
|
+
#
|
15
|
+
class OpenSSLExtensions::X509::CertificateChain
|
16
|
+
instance_methods.each { |m| undef_method m unless m =~ /(^__|^send$|^object_id$)/ }
|
17
|
+
|
18
|
+
def initialize(peer_certificate, certificates)
|
19
|
+
@certificates = []
|
20
|
+
reorganize!(peer_certificate, certificates)
|
21
|
+
end
|
22
|
+
|
23
|
+
def method_missing(method, *args, &block)
|
24
|
+
@certificates.send(method, *args, &block)
|
25
|
+
end
|
26
|
+
private :method_missing
|
27
|
+
|
28
|
+
def reorganize!(site_certificate, certificates)
|
29
|
+
return unless site_certificate && !certificates.empty?
|
30
|
+
certificate = nil
|
31
|
+
|
32
|
+
@certificates << (certificates.delete(site_certificate) || site_certificate || certificates.delete(certificates.detect { |c| c.subject_key_identifier.nil? }))
|
33
|
+
certificate = @certificates.first
|
34
|
+
|
35
|
+
until certificate.nil?
|
36
|
+
if certificate = certificates.detect { |authority| authority.allows_certificate_signing? && certificate.issuing_certificate?(authority) }
|
37
|
+
@certificates << certificates.delete(certificate)
|
38
|
+
else
|
39
|
+
authority = nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
private :reorganize!
|
44
|
+
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'openssl-extensions/x509'
|
2
2
|
|
3
|
+
##
|
4
|
+
# Extends OpenSSL::X509::Name with additional shortcut methods.
|
5
|
+
#
|
3
6
|
module OpenSSLExtensions::X509::Name
|
4
7
|
def organization
|
5
8
|
read_entry_by_oid('O')
|
@@ -21,6 +24,10 @@ module OpenSSLExtensions::X509::Name
|
|
21
24
|
read_entry_by_oid('L')
|
22
25
|
end
|
23
26
|
|
27
|
+
def location
|
28
|
+
[locality, state, country].compact.join(', ')
|
29
|
+
end
|
30
|
+
|
24
31
|
def state
|
25
32
|
read_entry_by_oid('ST')
|
26
33
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Nathaniel Bibler
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-04 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- lib/openssl-extensions/version.rb
|
48
48
|
- lib/openssl-extensions/x509/authority_key_identifier.rb
|
49
49
|
- lib/openssl-extensions/x509/certificate.rb
|
50
|
+
- lib/openssl-extensions/x509/certificate_chain.rb
|
50
51
|
- lib/openssl-extensions/x509/name.rb
|
51
52
|
- lib/openssl-extensions/x509.rb
|
52
53
|
- lib/openssl-extensions.rb
|