ruby-sslyze 0.2.1 → 1.0.0
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.
- checksums.yaml +4 -4
- data/.gitignore +6 -4
- data/.travis.yml +15 -7
- data/ChangeLog.md +29 -12
- data/Gemfile +3 -2
- data/LICENSE.txt +1 -1
- data/README.md +5 -5
- data/Rakefile +1 -1
- data/lib/sslyze/cipher_suites.rb +176 -0
- data/lib/sslyze/program.rb +8 -8
- data/lib/sslyze/task.rb +40 -33
- data/lib/sslyze/version.rb +1 -1
- data/lib/sslyze/{certificate/domain_name.rb → x509/domain.rb} +5 -3
- data/lib/sslyze/x509/extension.rb +15 -0
- data/lib/sslyze/x509/extension_set.rb +140 -0
- data/lib/sslyze/x509/extensions.rb +6 -0
- data/lib/sslyze/x509/extensions/basic_constraints.rb +41 -0
- data/lib/sslyze/x509/extensions/certificate_policies.rb +108 -0
- data/lib/sslyze/x509/extensions/crl_distribution_points.rb +47 -0
- data/lib/sslyze/x509/extensions/extended_key_usage.rb +58 -0
- data/lib/sslyze/x509/extensions/key_usage.rb +66 -0
- data/lib/sslyze/x509/extensions/subject_alt_name.rb +144 -0
- data/lib/sslyze/x509/name.rb +194 -0
- data/lib/sslyze/x509/public_key.rb +53 -0
- data/lib/sslyze/xml.rb +26 -37
- data/lib/sslyze/xml/attributes.rb +5 -0
- data/lib/sslyze/xml/attributes/error.rb +30 -0
- data/lib/sslyze/xml/attributes/exception.rb +30 -0
- data/lib/sslyze/xml/attributes/is_supported.rb +29 -0
- data/lib/sslyze/xml/attributes/is_vulnerable.rb +29 -0
- data/lib/sslyze/xml/attributes/title.rb +31 -0
- data/lib/sslyze/xml/certinfo.rb +67 -0
- data/lib/sslyze/xml/certinfo/certificate.rb +202 -0
- data/lib/sslyze/xml/certinfo/certificate_validation.rb +69 -0
- data/lib/sslyze/xml/certinfo/certificate_validation/hostname_validation.rb +54 -0
- data/lib/sslyze/xml/certinfo/certificate_validation/path_validation.rb +84 -0
- data/lib/sslyze/xml/certinfo/certificate_validation/verified_certificate_chain.rb +41 -0
- data/lib/sslyze/xml/certinfo/has_certificates.rb +102 -0
- data/lib/sslyze/xml/certinfo/ocsp_stapling.rb +45 -0
- data/lib/sslyze/xml/certinfo/ocsp_stapling/ocsp_response.rb +87 -0
- data/lib/sslyze/xml/certinfo/received_certificate_chain.rb +48 -0
- data/lib/sslyze/xml/compression.rb +33 -0
- data/lib/sslyze/xml/compression/compression_method.rb +38 -0
- data/lib/sslyze/xml/fallback.rb +34 -0
- data/lib/sslyze/xml/fallback/tls_fallback_scsv.rb +27 -0
- data/lib/sslyze/xml/heartbleed.rb +38 -0
- data/lib/sslyze/xml/heartbleed/openssl_heartbleed.rb +29 -0
- data/lib/sslyze/xml/http_headers.rb +42 -0
- data/lib/sslyze/xml/http_headers/http_public_key_pinning.rb +121 -0
- data/lib/sslyze/xml/http_headers/http_strict_transport_security.rb +59 -0
- data/lib/sslyze/xml/invalid_target.rb +33 -0
- data/lib/sslyze/xml/openssl_ccs.rb +34 -0
- data/lib/sslyze/xml/openssl_ccs/openssl_ccs_injection.rb +26 -0
- data/lib/sslyze/xml/plugin.rb +27 -0
- data/lib/sslyze/xml/protocol.rb +143 -0
- data/lib/sslyze/xml/protocol/cipher_suite.rb +93 -0
- data/lib/sslyze/xml/protocol/cipher_suite/key_exchange.rb +127 -0
- data/lib/sslyze/xml/reneg.rb +28 -0
- data/lib/sslyze/xml/reneg/session_renegotiation.rb +51 -0
- data/lib/sslyze/xml/resum.rb +42 -0
- data/lib/sslyze/xml/resum/session_resumption_with_session_ids.rb +94 -0
- data/lib/sslyze/xml/resum/session_resumption_with_tls_tickets.rb +69 -0
- data/lib/sslyze/xml/resum_rate.rb +30 -0
- data/lib/sslyze/xml/target.rb +371 -0
- data/lib/sslyze/xml/types.rb +19 -0
- data/ruby-sslyze.gemspec +3 -3
- data/spec/spec_helper.rb +2 -4
- data/spec/sslyze.xml +2356 -2580
- data/spec/x509/domain_spec.rb +125 -0
- data/spec/x509/extension_set_spec.rb +208 -0
- data/spec/x509/extension_spec.rb +58 -0
- data/spec/x509/extensions/basic_constraints_spec.rb +41 -0
- data/spec/x509/extensions/certificate_policies_spec.rb +38 -0
- data/spec/x509/extensions/crl_distribution_points_spec.rb +38 -0
- data/spec/x509/extensions/extended_key_usage_spec.rb +58 -0
- data/spec/x509/extensions/key_usage_spec.rb +84 -0
- data/spec/x509/extensions/subject_alt_name_spec.rb +146 -0
- data/spec/x509/name_spec.rb +85 -0
- data/spec/x509/public_key_spec.rb +113 -0
- data/spec/xml/certinfo/certificate_spec.rb +166 -0
- data/spec/xml/certinfo/certificate_validation/hostname_validation_spec.rb +23 -0
- data/spec/xml/certinfo/certificate_validation/path_validation_spec.rb +107 -0
- data/spec/xml/certinfo/certificate_validation/verified_certificate_chain_spec.rb +163 -0
- data/spec/xml/certinfo/certificate_validation_spec.rb +40 -0
- data/spec/xml/certinfo/ocsp_stapling/ocsp_response_spec.rb +61 -0
- data/spec/xml/certinfo/ocsp_stapling_spec.rb +31 -0
- data/spec/xml/certinfo/received_certificate_chain_spec.rb +165 -0
- data/spec/xml/certinfo_spec.rb +45 -0
- data/spec/xml/compression/compression_method_spec.rb +23 -0
- data/spec/xml/compression_spec.rb +23 -0
- data/spec/xml/heartbleed/openssl_heartbleed_spec.rb +17 -0
- data/spec/xml/heartbleed_spec.rb +37 -0
- data/spec/xml/http_headers/http_public_key_pinning_spec.rb +73 -0
- data/spec/xml/http_headers/http_strict_transport_security_spec.rb +107 -0
- data/spec/xml/http_headers_spec.rb +63 -0
- data/spec/xml/invalid_target_spec.rb +23 -0
- data/spec/xml/plugin_examples.rb +14 -0
- data/spec/{key_exchange_spec.rb → xml/protocol/cipher_suite/key_exchange_spec.rb} +9 -3
- data/spec/xml/protocol/cipher_suite_spec.rb +66 -0
- data/spec/xml/protocol_spec.rb +115 -0
- data/spec/xml/reneg/session_renegotiation_spec.rb +23 -0
- data/spec/xml/reneg_spec.rb +35 -0
- data/spec/xml/resum/session_resumption_with_session_ids_spec.rb +103 -0
- data/spec/xml/resum/session_resumption_with_tls_tickets_spec.rb +121 -0
- data/spec/xml/resum_rate_spec.rb +30 -0
- data/spec/xml/resum_spec.rb +47 -0
- data/spec/{target_spec.rb → xml/target_spec.rb} +73 -27
- data/spec/xml_spec.rb +13 -21
- metadata +138 -61
- data/lib/sslyze/cert_info.rb +0 -57
- data/lib/sslyze/certificate.rb +0 -139
- data/lib/sslyze/certificate/extensions.rb +0 -127
- data/lib/sslyze/certificate/extensions/authority_information_access.rb +0 -38
- data/lib/sslyze/certificate/extensions/extension.rb +0 -26
- data/lib/sslyze/certificate/extensions/x509v3_basic_constraints.rb +0 -60
- data/lib/sslyze/certificate/extensions/x509v3_certificate_policies.rb +0 -50
- data/lib/sslyze/certificate/extensions/x509v3_crl_distribution_points.rb +0 -32
- data/lib/sslyze/certificate/extensions/x509v3_extended_key_usage.rb +0 -32
- data/lib/sslyze/certificate/extensions/x509v3_key_usage.rb +0 -50
- data/lib/sslyze/certificate/extensions/x509v3_subject_alternative_name.rb +0 -71
- data/lib/sslyze/certificate/issuer.rb +0 -56
- data/lib/sslyze/certificate/public_key.rb +0 -9
- data/lib/sslyze/certificate/subject.rb +0 -117
- data/lib/sslyze/certificate/subject_public_key_info.rb +0 -53
- data/lib/sslyze/certificate/validity.rb +0 -9
- data/lib/sslyze/certificate_chain.rb +0 -89
- data/lib/sslyze/certificate_validation.rb +0 -70
- data/lib/sslyze/cipher_suite.rb +0 -237
- data/lib/sslyze/invalid_target.rb +0 -35
- data/lib/sslyze/key_exchange.rb +0 -106
- data/lib/sslyze/ocsp_response.rb +0 -87
- data/lib/sslyze/protocol.rb +0 -133
- data/lib/sslyze/target.rb +0 -312
- data/lib/sslyze/types.rb +0 -17
- data/spec/cert_info_spec.rb +0 -29
- data/spec/certificate/subject_name_spec.rb +0 -72
- data/spec/certificate_chain_spec.rb +0 -61
- data/spec/certificate_spec.rb +0 -330
- data/spec/certificate_validation_spec.rb +0 -39
- data/spec/cipher_suite_spec.rb +0 -50
- data/spec/invalid_target_spec.rb +0 -21
- data/spec/issuer_spec.rb +0 -33
- data/spec/ocsp_response_spec.rb +0 -59
- data/spec/protocol_spec.rb +0 -99
- data/spec/subject_public_key_info_spec.rb +0 -35
- data/spec/subject_spec.rb +0 -69
data/lib/sslyze/xml.rb
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
|
-
require 'sslyze/target'
|
|
2
|
-
require 'sslyze/invalid_target'
|
|
3
|
-
require 'sslyze/types'
|
|
1
|
+
require 'sslyze/xml/target'
|
|
2
|
+
require 'sslyze/xml/invalid_target'
|
|
3
|
+
require 'sslyze/xml/types'
|
|
4
|
+
require 'sslyze/xml/attributes/title'
|
|
5
|
+
|
|
4
6
|
require 'nokogiri'
|
|
5
7
|
|
|
6
8
|
module SSLyze
|
|
7
9
|
#
|
|
8
10
|
# Represents the XML output from sslyze.
|
|
9
11
|
#
|
|
12
|
+
# @see https://github.com/nabla-c0d3/sslyze/blob/master/xml_out.xsd
|
|
13
|
+
#
|
|
10
14
|
class XML
|
|
11
15
|
|
|
12
16
|
include Types
|
|
17
|
+
include Attributes::Title
|
|
13
18
|
|
|
14
19
|
#
|
|
15
20
|
# Initializes the XML.
|
|
@@ -51,7 +56,7 @@ module SSLyze
|
|
|
51
56
|
# @return [String]
|
|
52
57
|
#
|
|
53
58
|
def version
|
|
54
|
-
@version ||= @doc.
|
|
59
|
+
@version ||= @doc.at_xpath('/document/@SSLyzeVersion').value
|
|
55
60
|
end
|
|
56
61
|
|
|
57
62
|
#
|
|
@@ -59,26 +64,10 @@ module SSLyze
|
|
|
59
64
|
#
|
|
60
65
|
# @return [Integer]
|
|
61
66
|
#
|
|
62
|
-
|
|
63
|
-
@default_time ||= @doc.at('/document/results/@defaultTimeout').value.to_i
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
#
|
|
67
|
-
# Whether an HTTPS tunnel was used.
|
|
67
|
+
# @since 1.0.0
|
|
68
68
|
#
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def https_tunnel
|
|
72
|
-
@https_tunnel ||= Boolean[@doc.at('/document/results/@httpsTunnel').value]
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
#
|
|
76
|
-
# Specifies whether STARTTLS was enabled.
|
|
77
|
-
#
|
|
78
|
-
# @return [Boolean]
|
|
79
|
-
#
|
|
80
|
-
def start_tls
|
|
81
|
-
@start_tls ||= Boolean[@doc.at('/document/results/@startTLS').value]
|
|
69
|
+
def network_timeout
|
|
70
|
+
@default_time ||= @doc.at_xpath('/document/results/@networkTimeout').value.to_i
|
|
82
71
|
end
|
|
83
72
|
|
|
84
73
|
#
|
|
@@ -87,18 +76,7 @@ module SSLyze
|
|
|
87
76
|
# @return [Float]
|
|
88
77
|
#
|
|
89
78
|
def total_scan_time
|
|
90
|
-
@start_tls ||= @doc.
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
#
|
|
94
|
-
# @return [Array<InvalidTarget>]
|
|
95
|
-
#
|
|
96
|
-
# @see #each_invalid_target
|
|
97
|
-
#
|
|
98
|
-
# @since 0.2.0
|
|
99
|
-
#
|
|
100
|
-
def invalid_targets
|
|
101
|
-
each_invalid_target.to_a
|
|
79
|
+
@start_tls ||= @doc.at_xpath('/document/results/@totalScanTime').value.to_f
|
|
102
80
|
end
|
|
103
81
|
|
|
104
82
|
# Enumerates over each invalid target.
|
|
@@ -114,11 +92,22 @@ module SSLyze
|
|
|
114
92
|
def each_invalid_target
|
|
115
93
|
return enum_for(__method__) unless block_given?
|
|
116
94
|
|
|
117
|
-
@doc.
|
|
95
|
+
@doc.xpath('/document/invalidTargets/invalidTarget').each do |inval|
|
|
118
96
|
yield InvalidTarget.new(inval)
|
|
119
97
|
end
|
|
120
98
|
end
|
|
121
99
|
|
|
100
|
+
#
|
|
101
|
+
# @return [Array<InvalidTarget>]
|
|
102
|
+
#
|
|
103
|
+
# @see #each_invalid_target
|
|
104
|
+
#
|
|
105
|
+
# @since 0.2.0
|
|
106
|
+
#
|
|
107
|
+
def invalid_targets
|
|
108
|
+
each_invalid_target.to_a
|
|
109
|
+
end
|
|
110
|
+
|
|
122
111
|
#
|
|
123
112
|
# Enumerates over each target.
|
|
124
113
|
#
|
|
@@ -131,7 +120,7 @@ module SSLyze
|
|
|
131
120
|
def each_target
|
|
132
121
|
return enum_for(__method__) unless block_given?
|
|
133
122
|
|
|
134
|
-
@doc.
|
|
123
|
+
@doc.xpath('/document/results/target').each do |target|
|
|
135
124
|
yield Target.new(target)
|
|
136
125
|
end
|
|
137
126
|
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module SSLyze
|
|
2
|
+
class XML
|
|
3
|
+
module Attributes
|
|
4
|
+
#
|
|
5
|
+
# Provides methods for parsing the `error` XML attribute.
|
|
6
|
+
#
|
|
7
|
+
# @since 1.0.0
|
|
8
|
+
#
|
|
9
|
+
module Error
|
|
10
|
+
#
|
|
11
|
+
# The error message, if an error occurred.
|
|
12
|
+
#
|
|
13
|
+
# @return [String, nil]
|
|
14
|
+
#
|
|
15
|
+
def error
|
|
16
|
+
@error ||= @node['error']
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Determines if an error occurred.
|
|
21
|
+
#
|
|
22
|
+
# @return [Boolean]
|
|
23
|
+
#
|
|
24
|
+
def error?
|
|
25
|
+
!error.nil?
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module SSLyze
|
|
2
|
+
class XML
|
|
3
|
+
module Attributes
|
|
4
|
+
#
|
|
5
|
+
# Provides methods for accessing the `exception` XML attribute.
|
|
6
|
+
#
|
|
7
|
+
# @since 1.0.0
|
|
8
|
+
#
|
|
9
|
+
module Exception
|
|
10
|
+
#
|
|
11
|
+
# The exception message, if an exception occurred.
|
|
12
|
+
#
|
|
13
|
+
# @return [String, nil]
|
|
14
|
+
#
|
|
15
|
+
def exception
|
|
16
|
+
@exception ||= @node['exception']
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Tests whether an exception occurred.
|
|
21
|
+
#
|
|
22
|
+
# @return [Boolean]
|
|
23
|
+
#
|
|
24
|
+
def exception?
|
|
25
|
+
!exception.nil?
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'sslyze/xml/types'
|
|
2
|
+
|
|
3
|
+
module SSLyze
|
|
4
|
+
class XML
|
|
5
|
+
module Attributes
|
|
6
|
+
#
|
|
7
|
+
# Common methods for the `isSupported` attribute.
|
|
8
|
+
#
|
|
9
|
+
# @since 1.0.0
|
|
10
|
+
#
|
|
11
|
+
module IsSupported
|
|
12
|
+
|
|
13
|
+
include Types
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# Parses the `isSupported` attribute.
|
|
17
|
+
#
|
|
18
|
+
# @return [Boolean]
|
|
19
|
+
#
|
|
20
|
+
def is_supported?
|
|
21
|
+
Boolean[@node['isSupported']]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
alias supported? is_supported?
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'sslyze/xml/types'
|
|
2
|
+
|
|
3
|
+
module SSLyze
|
|
4
|
+
class XML
|
|
5
|
+
module Attributes
|
|
6
|
+
#
|
|
7
|
+
# Common methods for the `isVulnerable` attribute.
|
|
8
|
+
#
|
|
9
|
+
# @since 1.0.0
|
|
10
|
+
#
|
|
11
|
+
module IsVulnerable
|
|
12
|
+
|
|
13
|
+
include Types
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# Parses the `isVulnerable` attribute.
|
|
17
|
+
#
|
|
18
|
+
# @return [Boolean]
|
|
19
|
+
#
|
|
20
|
+
def is_vulnerable?
|
|
21
|
+
Boolean[@node['isVulnerable']]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
alias vulnerable? is_vulnerable?
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module SSLyze
|
|
2
|
+
class XML
|
|
3
|
+
module Attributes
|
|
4
|
+
#
|
|
5
|
+
# Provides methods for accessing the `title` XML attribute.
|
|
6
|
+
#
|
|
7
|
+
# @since 1.0.0
|
|
8
|
+
#
|
|
9
|
+
module Title
|
|
10
|
+
#
|
|
11
|
+
# The title.
|
|
12
|
+
#
|
|
13
|
+
# @return [String, nil]
|
|
14
|
+
# The value of the `title` attribute.
|
|
15
|
+
#
|
|
16
|
+
def title
|
|
17
|
+
@title ||= @node['title']
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# The title or an empty String.
|
|
22
|
+
#
|
|
23
|
+
# @return [String]
|
|
24
|
+
#
|
|
25
|
+
def to_s
|
|
26
|
+
title || ''
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require 'sslyze/xml/plugin'
|
|
2
|
+
require 'sslyze/xml/certinfo/received_certificate_chain'
|
|
3
|
+
require 'sslyze/xml/certinfo/certificate_validation'
|
|
4
|
+
require 'sslyze/xml/certinfo/certificate_validation/verified_certificate_chain'
|
|
5
|
+
require 'sslyze/xml/certinfo/ocsp_stapling'
|
|
6
|
+
|
|
7
|
+
module SSLyze
|
|
8
|
+
class XML
|
|
9
|
+
#
|
|
10
|
+
# Represents the `<certinfo>` XML element.
|
|
11
|
+
#
|
|
12
|
+
# @since 1.0.0
|
|
13
|
+
#
|
|
14
|
+
class Certinfo < Plugin
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# The received certificate chain.
|
|
18
|
+
#
|
|
19
|
+
# @return [ReceivedCertificateChain]
|
|
20
|
+
#
|
|
21
|
+
def received_certificate_chain
|
|
22
|
+
@received_certificate_chain ||= ReceivedCertificateChain.new(
|
|
23
|
+
@node.at_xpath('receivedCertificateChain')
|
|
24
|
+
)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
alias received_chain received_certificate_chain
|
|
28
|
+
|
|
29
|
+
#
|
|
30
|
+
# Certificate validation information.
|
|
31
|
+
#
|
|
32
|
+
# @return [CertificateValidation]
|
|
33
|
+
#
|
|
34
|
+
def certificate_validation
|
|
35
|
+
@certificate_validation ||= CertificateValidation.new(
|
|
36
|
+
@node.at_xpath('certificateValidation')
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
alias validation certificate_validation
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# The verified certificate chain.
|
|
44
|
+
#
|
|
45
|
+
# @return [VerifiedCertificateChain, nil]
|
|
46
|
+
#
|
|
47
|
+
def verified_certificate_chain
|
|
48
|
+
@verified_certificate_chain ||= if (element = @node.at_xpath('certificateValidation/verifiedCertificateChain'))
|
|
49
|
+
CertificateValidation::VerifiedCertificateChain.new(element)
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
alias verified_chain verified_certificate_chain
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# OCSP Stapling.
|
|
58
|
+
#
|
|
59
|
+
# @return [OCSPStapling]
|
|
60
|
+
#
|
|
61
|
+
def ocsp_stapling
|
|
62
|
+
@ocsp_stapling ||= OCSPStapling.new(@node.at_xpath('ocspStapling'))
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
require 'sslyze/xml/plugin'
|
|
2
|
+
require 'sslyze/x509/name'
|
|
3
|
+
require 'sslyze/x509/extension_set'
|
|
4
|
+
require 'sslyze/x509/public_key'
|
|
5
|
+
|
|
6
|
+
require 'openssl'
|
|
7
|
+
|
|
8
|
+
module SSLyze
|
|
9
|
+
class XML
|
|
10
|
+
class Certinfo < Plugin
|
|
11
|
+
#
|
|
12
|
+
# Represents the `<certificate>` XML element.
|
|
13
|
+
#
|
|
14
|
+
class Certificate
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# Initializes the certificate.
|
|
18
|
+
#
|
|
19
|
+
# @param [Nokogiri::XML::Node] node
|
|
20
|
+
# The `<certificate>` XML element.
|
|
21
|
+
#
|
|
22
|
+
def initialize(node)
|
|
23
|
+
@node = node
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# The AS PEM information.
|
|
28
|
+
#
|
|
29
|
+
# @return [String]
|
|
30
|
+
#
|
|
31
|
+
def as_pem
|
|
32
|
+
@as_pem ||= @node.at_xpath('asPEM').inner_text
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
alias to_s as_pem
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# The parsed X509 certificate.
|
|
39
|
+
#
|
|
40
|
+
# @return [OpenSSL::X509::Certificate]
|
|
41
|
+
#
|
|
42
|
+
# @see http://www.rubydoc.info/stdlib/openssl/OpenSSL/X509/Certificate
|
|
43
|
+
#
|
|
44
|
+
# @since 1.0.0
|
|
45
|
+
#
|
|
46
|
+
def x509
|
|
47
|
+
@x509 ||= OpenSSL::X509::Certificate.new(as_pem)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# @return [X509::ExtensionSet]
|
|
52
|
+
#
|
|
53
|
+
# @group OpenSSL Methods
|
|
54
|
+
#
|
|
55
|
+
def extensions
|
|
56
|
+
X509::ExtensionSet.new(x509.extensions)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
#
|
|
60
|
+
# @return [X509::Name]
|
|
61
|
+
#
|
|
62
|
+
# @see http://www.rubydoc.info/stdlib/openssl/OpenSSL/X509/Name
|
|
63
|
+
#
|
|
64
|
+
# @group OpenSSL Methods
|
|
65
|
+
#
|
|
66
|
+
def issuer
|
|
67
|
+
@issuer ||= X509::Name.new(x509.issuer)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# @return [Time]
|
|
72
|
+
#
|
|
73
|
+
# @group OpenSSL Methods
|
|
74
|
+
#
|
|
75
|
+
def not_after
|
|
76
|
+
x509.not_after
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
#
|
|
80
|
+
# @return [Time]
|
|
81
|
+
#
|
|
82
|
+
# @group OpenSSL Methods
|
|
83
|
+
#
|
|
84
|
+
def not_before
|
|
85
|
+
x509.not_before
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
#
|
|
89
|
+
# @return [X509::PublicKey]
|
|
90
|
+
#
|
|
91
|
+
# @group OpenSSL Methods
|
|
92
|
+
#
|
|
93
|
+
def public_key
|
|
94
|
+
@public_key ||= X509::PublicKey.new(x509.public_key)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
#
|
|
98
|
+
# @return [OpenSSL::BN]
|
|
99
|
+
#
|
|
100
|
+
# @see http://www.rubydoc.info/stdlib/openssl/OpenSSL/BN
|
|
101
|
+
#
|
|
102
|
+
# @group OpenSSL Methods
|
|
103
|
+
#
|
|
104
|
+
def serial
|
|
105
|
+
x509.serial
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# @return [String]
|
|
110
|
+
#
|
|
111
|
+
# @group OpenSSL Methods
|
|
112
|
+
#
|
|
113
|
+
def signature_algorithm
|
|
114
|
+
x509.signature_algorithm
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
#
|
|
118
|
+
# @return [X509::Name]
|
|
119
|
+
#
|
|
120
|
+
# @group OpenSSL Methods
|
|
121
|
+
#
|
|
122
|
+
def subject
|
|
123
|
+
@subject ||= X509::Name.new(x509.subject)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
#
|
|
127
|
+
# @return [String]
|
|
128
|
+
#
|
|
129
|
+
# @group OpenSSL Methods
|
|
130
|
+
#
|
|
131
|
+
def to_der
|
|
132
|
+
x509.to_der
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
#
|
|
136
|
+
# @return [String]
|
|
137
|
+
#
|
|
138
|
+
# @group OpenSSL Methods
|
|
139
|
+
#
|
|
140
|
+
def to_text
|
|
141
|
+
x509.to_text
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
#
|
|
145
|
+
# @return [Integer]
|
|
146
|
+
#
|
|
147
|
+
# @group OpenSSL Methods
|
|
148
|
+
#
|
|
149
|
+
def version
|
|
150
|
+
x509.version
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
#
|
|
154
|
+
# The SHA1 fingerprint of the cert.
|
|
155
|
+
#
|
|
156
|
+
# @return [String]
|
|
157
|
+
#
|
|
158
|
+
def sha1_fingerprint
|
|
159
|
+
@sha1_fingerprint ||= @node['sha1Fingerprint']
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
#
|
|
163
|
+
# The HPKP SHA256 Pin.
|
|
164
|
+
#
|
|
165
|
+
# @return [String]
|
|
166
|
+
#
|
|
167
|
+
# @since 1.0.0
|
|
168
|
+
#
|
|
169
|
+
def hpkp_sha256_pin
|
|
170
|
+
@hpkp_sha256_pin ||= @node['hpkpSha256Pin']
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
#
|
|
174
|
+
# The supplied server name indication.
|
|
175
|
+
#
|
|
176
|
+
# @return [String]
|
|
177
|
+
#
|
|
178
|
+
# @since 1.0.0
|
|
179
|
+
#
|
|
180
|
+
def supplied_server_name_indication
|
|
181
|
+
@supplied_server_name_indication ||= @node['suppliedServerNameIndication']
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
#
|
|
185
|
+
# Compares the other certificiate to this certificate.
|
|
186
|
+
#
|
|
187
|
+
# @param [Certificate] other
|
|
188
|
+
# The other certificate.
|
|
189
|
+
#
|
|
190
|
+
# @return [Boolean]
|
|
191
|
+
# Whether the other certificate has the same {#as_pem}.
|
|
192
|
+
#
|
|
193
|
+
# @since 1.0.0
|
|
194
|
+
#
|
|
195
|
+
def ==(other)
|
|
196
|
+
other.kind_of?(self.class) && other.as_pem == as_pem
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|