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.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -4
  3. data/.travis.yml +15 -7
  4. data/ChangeLog.md +29 -12
  5. data/Gemfile +3 -2
  6. data/LICENSE.txt +1 -1
  7. data/README.md +5 -5
  8. data/Rakefile +1 -1
  9. data/lib/sslyze/cipher_suites.rb +176 -0
  10. data/lib/sslyze/program.rb +8 -8
  11. data/lib/sslyze/task.rb +40 -33
  12. data/lib/sslyze/version.rb +1 -1
  13. data/lib/sslyze/{certificate/domain_name.rb → x509/domain.rb} +5 -3
  14. data/lib/sslyze/x509/extension.rb +15 -0
  15. data/lib/sslyze/x509/extension_set.rb +140 -0
  16. data/lib/sslyze/x509/extensions.rb +6 -0
  17. data/lib/sslyze/x509/extensions/basic_constraints.rb +41 -0
  18. data/lib/sslyze/x509/extensions/certificate_policies.rb +108 -0
  19. data/lib/sslyze/x509/extensions/crl_distribution_points.rb +47 -0
  20. data/lib/sslyze/x509/extensions/extended_key_usage.rb +58 -0
  21. data/lib/sslyze/x509/extensions/key_usage.rb +66 -0
  22. data/lib/sslyze/x509/extensions/subject_alt_name.rb +144 -0
  23. data/lib/sslyze/x509/name.rb +194 -0
  24. data/lib/sslyze/x509/public_key.rb +53 -0
  25. data/lib/sslyze/xml.rb +26 -37
  26. data/lib/sslyze/xml/attributes.rb +5 -0
  27. data/lib/sslyze/xml/attributes/error.rb +30 -0
  28. data/lib/sslyze/xml/attributes/exception.rb +30 -0
  29. data/lib/sslyze/xml/attributes/is_supported.rb +29 -0
  30. data/lib/sslyze/xml/attributes/is_vulnerable.rb +29 -0
  31. data/lib/sslyze/xml/attributes/title.rb +31 -0
  32. data/lib/sslyze/xml/certinfo.rb +67 -0
  33. data/lib/sslyze/xml/certinfo/certificate.rb +202 -0
  34. data/lib/sslyze/xml/certinfo/certificate_validation.rb +69 -0
  35. data/lib/sslyze/xml/certinfo/certificate_validation/hostname_validation.rb +54 -0
  36. data/lib/sslyze/xml/certinfo/certificate_validation/path_validation.rb +84 -0
  37. data/lib/sslyze/xml/certinfo/certificate_validation/verified_certificate_chain.rb +41 -0
  38. data/lib/sslyze/xml/certinfo/has_certificates.rb +102 -0
  39. data/lib/sslyze/xml/certinfo/ocsp_stapling.rb +45 -0
  40. data/lib/sslyze/xml/certinfo/ocsp_stapling/ocsp_response.rb +87 -0
  41. data/lib/sslyze/xml/certinfo/received_certificate_chain.rb +48 -0
  42. data/lib/sslyze/xml/compression.rb +33 -0
  43. data/lib/sslyze/xml/compression/compression_method.rb +38 -0
  44. data/lib/sslyze/xml/fallback.rb +34 -0
  45. data/lib/sslyze/xml/fallback/tls_fallback_scsv.rb +27 -0
  46. data/lib/sslyze/xml/heartbleed.rb +38 -0
  47. data/lib/sslyze/xml/heartbleed/openssl_heartbleed.rb +29 -0
  48. data/lib/sslyze/xml/http_headers.rb +42 -0
  49. data/lib/sslyze/xml/http_headers/http_public_key_pinning.rb +121 -0
  50. data/lib/sslyze/xml/http_headers/http_strict_transport_security.rb +59 -0
  51. data/lib/sslyze/xml/invalid_target.rb +33 -0
  52. data/lib/sslyze/xml/openssl_ccs.rb +34 -0
  53. data/lib/sslyze/xml/openssl_ccs/openssl_ccs_injection.rb +26 -0
  54. data/lib/sslyze/xml/plugin.rb +27 -0
  55. data/lib/sslyze/xml/protocol.rb +143 -0
  56. data/lib/sslyze/xml/protocol/cipher_suite.rb +93 -0
  57. data/lib/sslyze/xml/protocol/cipher_suite/key_exchange.rb +127 -0
  58. data/lib/sslyze/xml/reneg.rb +28 -0
  59. data/lib/sslyze/xml/reneg/session_renegotiation.rb +51 -0
  60. data/lib/sslyze/xml/resum.rb +42 -0
  61. data/lib/sslyze/xml/resum/session_resumption_with_session_ids.rb +94 -0
  62. data/lib/sslyze/xml/resum/session_resumption_with_tls_tickets.rb +69 -0
  63. data/lib/sslyze/xml/resum_rate.rb +30 -0
  64. data/lib/sslyze/xml/target.rb +371 -0
  65. data/lib/sslyze/xml/types.rb +19 -0
  66. data/ruby-sslyze.gemspec +3 -3
  67. data/spec/spec_helper.rb +2 -4
  68. data/spec/sslyze.xml +2356 -2580
  69. data/spec/x509/domain_spec.rb +125 -0
  70. data/spec/x509/extension_set_spec.rb +208 -0
  71. data/spec/x509/extension_spec.rb +58 -0
  72. data/spec/x509/extensions/basic_constraints_spec.rb +41 -0
  73. data/spec/x509/extensions/certificate_policies_spec.rb +38 -0
  74. data/spec/x509/extensions/crl_distribution_points_spec.rb +38 -0
  75. data/spec/x509/extensions/extended_key_usage_spec.rb +58 -0
  76. data/spec/x509/extensions/key_usage_spec.rb +84 -0
  77. data/spec/x509/extensions/subject_alt_name_spec.rb +146 -0
  78. data/spec/x509/name_spec.rb +85 -0
  79. data/spec/x509/public_key_spec.rb +113 -0
  80. data/spec/xml/certinfo/certificate_spec.rb +166 -0
  81. data/spec/xml/certinfo/certificate_validation/hostname_validation_spec.rb +23 -0
  82. data/spec/xml/certinfo/certificate_validation/path_validation_spec.rb +107 -0
  83. data/spec/xml/certinfo/certificate_validation/verified_certificate_chain_spec.rb +163 -0
  84. data/spec/xml/certinfo/certificate_validation_spec.rb +40 -0
  85. data/spec/xml/certinfo/ocsp_stapling/ocsp_response_spec.rb +61 -0
  86. data/spec/xml/certinfo/ocsp_stapling_spec.rb +31 -0
  87. data/spec/xml/certinfo/received_certificate_chain_spec.rb +165 -0
  88. data/spec/xml/certinfo_spec.rb +45 -0
  89. data/spec/xml/compression/compression_method_spec.rb +23 -0
  90. data/spec/xml/compression_spec.rb +23 -0
  91. data/spec/xml/heartbleed/openssl_heartbleed_spec.rb +17 -0
  92. data/spec/xml/heartbleed_spec.rb +37 -0
  93. data/spec/xml/http_headers/http_public_key_pinning_spec.rb +73 -0
  94. data/spec/xml/http_headers/http_strict_transport_security_spec.rb +107 -0
  95. data/spec/xml/http_headers_spec.rb +63 -0
  96. data/spec/xml/invalid_target_spec.rb +23 -0
  97. data/spec/xml/plugin_examples.rb +14 -0
  98. data/spec/{key_exchange_spec.rb → xml/protocol/cipher_suite/key_exchange_spec.rb} +9 -3
  99. data/spec/xml/protocol/cipher_suite_spec.rb +66 -0
  100. data/spec/xml/protocol_spec.rb +115 -0
  101. data/spec/xml/reneg/session_renegotiation_spec.rb +23 -0
  102. data/spec/xml/reneg_spec.rb +35 -0
  103. data/spec/xml/resum/session_resumption_with_session_ids_spec.rb +103 -0
  104. data/spec/xml/resum/session_resumption_with_tls_tickets_spec.rb +121 -0
  105. data/spec/xml/resum_rate_spec.rb +30 -0
  106. data/spec/xml/resum_spec.rb +47 -0
  107. data/spec/{target_spec.rb → xml/target_spec.rb} +73 -27
  108. data/spec/xml_spec.rb +13 -21
  109. metadata +138 -61
  110. data/lib/sslyze/cert_info.rb +0 -57
  111. data/lib/sslyze/certificate.rb +0 -139
  112. data/lib/sslyze/certificate/extensions.rb +0 -127
  113. data/lib/sslyze/certificate/extensions/authority_information_access.rb +0 -38
  114. data/lib/sslyze/certificate/extensions/extension.rb +0 -26
  115. data/lib/sslyze/certificate/extensions/x509v3_basic_constraints.rb +0 -60
  116. data/lib/sslyze/certificate/extensions/x509v3_certificate_policies.rb +0 -50
  117. data/lib/sslyze/certificate/extensions/x509v3_crl_distribution_points.rb +0 -32
  118. data/lib/sslyze/certificate/extensions/x509v3_extended_key_usage.rb +0 -32
  119. data/lib/sslyze/certificate/extensions/x509v3_key_usage.rb +0 -50
  120. data/lib/sslyze/certificate/extensions/x509v3_subject_alternative_name.rb +0 -71
  121. data/lib/sslyze/certificate/issuer.rb +0 -56
  122. data/lib/sslyze/certificate/public_key.rb +0 -9
  123. data/lib/sslyze/certificate/subject.rb +0 -117
  124. data/lib/sslyze/certificate/subject_public_key_info.rb +0 -53
  125. data/lib/sslyze/certificate/validity.rb +0 -9
  126. data/lib/sslyze/certificate_chain.rb +0 -89
  127. data/lib/sslyze/certificate_validation.rb +0 -70
  128. data/lib/sslyze/cipher_suite.rb +0 -237
  129. data/lib/sslyze/invalid_target.rb +0 -35
  130. data/lib/sslyze/key_exchange.rb +0 -106
  131. data/lib/sslyze/ocsp_response.rb +0 -87
  132. data/lib/sslyze/protocol.rb +0 -133
  133. data/lib/sslyze/target.rb +0 -312
  134. data/lib/sslyze/types.rb +0 -17
  135. data/spec/cert_info_spec.rb +0 -29
  136. data/spec/certificate/subject_name_spec.rb +0 -72
  137. data/spec/certificate_chain_spec.rb +0 -61
  138. data/spec/certificate_spec.rb +0 -330
  139. data/spec/certificate_validation_spec.rb +0 -39
  140. data/spec/cipher_suite_spec.rb +0 -50
  141. data/spec/invalid_target_spec.rb +0 -21
  142. data/spec/issuer_spec.rb +0 -33
  143. data/spec/ocsp_response_spec.rb +0 -59
  144. data/spec/protocol_spec.rb +0 -99
  145. data/spec/subject_public_key_info_spec.rb +0 -35
  146. data/spec/subject_spec.rb +0 -69
@@ -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.at('/document/@SSLyzeVersion').value.split(' ',2).last
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
- def default_timeout
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
- # @return [Boolean]
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.at('/document/results/@totalScanTime').value.to_f
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.search('invalidTargets/invalidTarget').each do |inval|
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.search('/document/results/target').each do |target|
123
+ @doc.xpath('/document/results/target').each do |target|
135
124
  yield Target.new(target)
136
125
  end
137
126
  end
@@ -0,0 +1,5 @@
1
+ require 'sslyze/xml/attributes/title'
2
+ require 'sslyze/xml/attributes/is_supported'
3
+ require 'sslyze/xml/attributes/is_vulnerable'
4
+ require 'sslyze/xml/attributes/exception'
5
+ require 'sslyze/xml/attributes/error'
@@ -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