ssl_labs 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 757eafa88db5476feb6a61d68a5cf7fe7ca31433
4
+ data.tar.gz: 367750793ad3ed2d792145c511b536a81144388c
5
+ SHA512:
6
+ metadata.gz: da209d49df109bbf639114dbaaa396eb2ad51d538655b77119c7e3361281924d90e807c06679d91b388803a1aeae8b373ce8330b63937bd6aa791a9b127ca0eb
7
+ data.tar.gz: 1cc4c8e4429aff72b64e1c65276e370db2db5026cbf33cbe671e869e046de81c2ee1d092cfb80f137a700d81aeed9da162830d04eafb085ef28ea3ab5d64b769
data/README.md ADDED
@@ -0,0 +1,13 @@
1
+
2
+ # ssl_labs
3
+
4
+ A gem to provide a client for ssllabs.com SSL/TLS scanner.
5
+
6
+ The reference client is at https://github.com/ssllabs/ssllabs-scan
7
+
8
+ ## TODO
9
+
10
+ * Error handling
11
+
12
+ * Tests
13
+
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ require 'rake'
2
+ require 'rake/clean'
3
+ require 'rake/testtask'
4
+ require 'rdoc/task'
5
+ require 'rubygems/package_task'
6
+
7
+ desc 'Default task (package)'
8
+ task :default => [:package]
9
+
10
+ Rake::TestTask.new('test')
11
+
12
+ SPECFILE = 'ssl_labs.gemspec'
13
+ if File.exist?(SPECFILE)
14
+ spec = eval(File.read(SPECFILE))
15
+ Gem::PackageTask.new(spec).define
16
+ end
17
+
18
+ RDoc::Task.new do |rdoc|
19
+ rdoc.rdoc_dir = 'rdoc'
20
+ rdoc.title = 'ssl_labs'
21
+ rdoc.options << '--charset' << 'utf-8'
22
+ rdoc.options << '--all'
23
+ rdoc.rdoc_files.include('README.md')
24
+ rdoc.rdoc_files.include(FileList['lib/**/*'])
25
+ rdoc.rdoc_files.include(FileList['test/**/*'])
26
+ end
@@ -0,0 +1,34 @@
1
+ require 'ssl_labs/util'
2
+
3
+ class SslLabs
4
+
5
+ module Api
6
+
7
+ # Base URI for the API.
8
+ LOCATION = 'https://api.dev.ssllabs.com/api/fa78d5a4'
9
+
10
+ # Array of known methods.
11
+ METHODS = [
12
+ :analyze,
13
+ :get_endpoint_data,
14
+ :get_status_codes,
15
+ :info
16
+ ]
17
+
18
+ # Return the API URL for the given method and arguments.
19
+ def self.url(method, args={})
20
+ raise ArgumentError, "Unknown method #{method.inspect}" unless METHODS.include?(method)
21
+ camelized_method = Util::camelize(method)
22
+ query = if args.empty?
23
+ ''
24
+ else
25
+ '?' << args.map do |k, v|
26
+ "#{Util.camelize(k)}=#{v}"
27
+ end.join('&') # XXX escaping
28
+ end
29
+ "#{LOCATION}/#{camelized_method}#{query}"
30
+ end
31
+
32
+ end # Api
33
+
34
+ end # SslLabs
@@ -0,0 +1,46 @@
1
+ require 'ipaddr'
2
+ require 'json'
3
+
4
+ require 'ssl_labs/util'
5
+
6
+ class SslLabs
7
+
8
+ class Endpoint
9
+
10
+ ATTRS = [
11
+ :delegation,
12
+ :duration,
13
+ :eta,
14
+ :grade,
15
+ :has_warnings,
16
+ :ip_address,
17
+ :is_exceptional,
18
+ :progress,
19
+ :server_name,
20
+ :status_details,
21
+ :status_details_message,
22
+ :status_message
23
+ ]
24
+
25
+ attr_accessor(*ATTRS)
26
+
27
+ def self.from_hash(hash)
28
+ endpoint = self.new
29
+ hash.each do |k, v|
30
+ sym = Util.underscore(k).to_sym
31
+ if ATTRS.include?(sym)
32
+ if sym == :ip_address
33
+ endpoint.ip_address = IPAddr.new(v)
34
+ else
35
+ endpoint.send("#{sym}=", v)
36
+ end
37
+ else
38
+ raise ArgumentError, "Unknown key #{k.inspect} (#{sym})"
39
+ end
40
+ end
41
+ endpoint
42
+ end
43
+
44
+ end # Endpoint
45
+
46
+ end # SslLabs
@@ -0,0 +1,63 @@
1
+ require 'ssl_labs/util'
2
+
3
+ class SslLabs
4
+
5
+ class EndpointData
6
+
7
+ class Details
8
+
9
+ class Cert
10
+
11
+ ATTRS = [
12
+ :alt_names,
13
+ :common_names,
14
+ :crl_uris,
15
+ :issuer_label,
16
+ :issuer_subject,
17
+ :issues,
18
+ :label,
19
+ :not_after,
20
+ :not_before,
21
+ :ocsp_uris,
22
+ :raw,
23
+ :revocation_info,
24
+ :revocation_status,
25
+ :sgc,
26
+ :sig_alg,
27
+ :subject,
28
+ :validation_type
29
+ ]
30
+
31
+ attr_accessor(*ATTRS)
32
+
33
+ def self.from_hash(hash)
34
+ cert = self.new
35
+ hash.each do |k, v|
36
+ sym = Util.underscore(k).to_sym
37
+ case sym
38
+ when :crl_ur_is
39
+ cert.crl_uris = v
40
+ when :not_after
41
+ cert.not_after = Time.at(v / 1000.0)
42
+ when :not_before
43
+ cert.not_before = Time.at(v / 1000.0)
44
+ when :ocsp_ur_is
45
+ cert.ocsp_uris = v
46
+ when :scg
47
+ cert.sgc = v
48
+ when *ATTRS
49
+ cert.send("#{sym}=", v)
50
+ else
51
+ raise ArgumentError, "Unknown key #{k.inspect} (#{sym.inspect})"
52
+ end
53
+ end
54
+ cert
55
+ end
56
+
57
+ end # Cert
58
+
59
+ end # Details
60
+
61
+ end # EndpointData
62
+
63
+ end # SslLabs
@@ -0,0 +1,40 @@
1
+ require 'ssl_labs/endpoint_data/details/cert'
2
+
3
+ class SslLabs
4
+
5
+ class EndpointData
6
+
7
+ class Details
8
+
9
+ class Chain
10
+
11
+ ATTRS = [
12
+ :certs,
13
+ :issues
14
+ ]
15
+
16
+ attr_accessor(*ATTRS)
17
+
18
+ def self.from_hash(hash)
19
+ chain = self.new
20
+ hash.each do |k, v|
21
+ sym = Util.underscore(k).to_sym
22
+ case sym
23
+ when :certs
24
+ chain.certs = v.map { |cert| Cert.from_hash(cert) }
25
+ when *ATTRS
26
+ chain.send("#{sym}=", v)
27
+ else
28
+ raise ArgumentError, "Unknown key #{k.inspect} (#{sym.inspect})"
29
+ end
30
+ end
31
+ chain
32
+ end
33
+
34
+ end # Chain
35
+
36
+ end # Details
37
+
38
+ end # EndpointData
39
+
40
+ end # SslLabs
@@ -0,0 +1,40 @@
1
+ require 'ssl_labs/util'
2
+
3
+ class SslLabs
4
+
5
+ class EndpointData
6
+
7
+ class Details
8
+
9
+ class Key
10
+
11
+ ATTRS = [
12
+ :size,
13
+ :strength,
14
+ :alg,
15
+ :debian_flaw,
16
+ :q
17
+ ]
18
+
19
+ attr_accessor(*ATTRS)
20
+
21
+ def self.from_hash(hash)
22
+ key = self.new
23
+ hash.each do |k, v|
24
+ sym = Util.underscore(k).to_sym
25
+ if ATTRS.include?(sym)
26
+ key.send("#{sym}=", v)
27
+ else
28
+ raise ArgumentError, "Unknown key #{k.inspect} (#{sym.inspect})"
29
+ end
30
+ end
31
+ key
32
+ end
33
+
34
+ end # Key
35
+
36
+ end # Details
37
+
38
+ end # EndpointData
39
+
40
+ end # SslLabs
@@ -0,0 +1,38 @@
1
+ require 'ssl_labs/util'
2
+
3
+ class SslLabs
4
+
5
+ class EndpointData
6
+
7
+ class Details
8
+
9
+ class Protocol
10
+
11
+ ATTRS = [
12
+ :id,
13
+ :name,
14
+ :version
15
+ ]
16
+
17
+ attr_accessor(*ATTRS)
18
+
19
+ def self.from_hash(hash)
20
+ protocol = self.new
21
+ hash.each do |k, v|
22
+ sym = Util.underscore(k).to_sym
23
+ if ATTRS.include?(sym)
24
+ protocol.send("#{sym}=", v)
25
+ else
26
+ raise ArgumentError, "Unknown key #{k.inspect} (#{sym.inspect})"
27
+ end
28
+ end
29
+ protocol
30
+ end
31
+
32
+ end # Protocol
33
+
34
+ end # Details
35
+
36
+ end # EndpointData
37
+
38
+ end # SslLabs
@@ -0,0 +1,43 @@
1
+ require 'ssl_labs/util'
2
+
3
+ class SslLabs
4
+
5
+ class EndpointData
6
+
7
+ class Details
8
+
9
+ class Sim
10
+
11
+ class Client
12
+
13
+ ATTRS = [
14
+ :id,
15
+ :name,
16
+ :platform,
17
+ :version,
18
+ :is_reference
19
+ ]
20
+ attr_accessor(*ATTRS)
21
+
22
+ def self.from_hash(hash)
23
+ client = self.new
24
+ hash.each do |k, v|
25
+ sym = Util.underscore(k).to_sym
26
+ if ATTRS.include?(sym)
27
+ client.send("#{sym}=", v)
28
+ else
29
+ raise ArgumentError, "Unknown key #{k.inspect} (#{sym.inspect})"
30
+ end
31
+ end
32
+ client
33
+ end
34
+
35
+ end # Client
36
+
37
+ end # Sim
38
+
39
+ end # Details
40
+
41
+ end # EndpointData
42
+
43
+ end # SslLabs
@@ -0,0 +1,43 @@
1
+ require 'ssl_labs/endpoint_data/details/sim/client'
2
+ require 'ssl_labs/util'
3
+
4
+ class SslLabs
5
+
6
+ class EndpointData
7
+
8
+ class Details
9
+
10
+ class Sim
11
+
12
+ ATTRS = [
13
+ :client,
14
+ :error_code,
15
+ :attempts,
16
+ :protocol_id,
17
+ :suite_id
18
+ ]
19
+
20
+ attr_accessor(*ATTRS)
21
+
22
+ def self.from_hash(hash)
23
+ sim = self.new
24
+ hash.each do |k, v|
25
+ sym = Util.underscore(k).to_sym
26
+ if sym == :client
27
+ sim.client = Sim::Client.from_hash(v)
28
+ elsif ATTRS.include?(sym)
29
+ sim.send("#{sym}=", v)
30
+ else
31
+ raise ArgumentError, "Unknown key #{k.inspect} (#{sym.inspect})"
32
+ end
33
+ end
34
+ sim
35
+ end
36
+
37
+ end # Sim
38
+
39
+ end # Details
40
+
41
+ end # EndpointData
42
+
43
+ end # SslLabs
@@ -0,0 +1,43 @@
1
+ require 'ssl_labs/util'
2
+
3
+ class SslLabs
4
+
5
+ class EndpointData
6
+
7
+ class Details
8
+
9
+ class Suite
10
+
11
+ ATTRS = [
12
+ :id,
13
+ :name,
14
+ :cipher_strength,
15
+ :dh_strength,
16
+ :dh_p,
17
+ :dh_g,
18
+ :dh_ys,
19
+ :q
20
+ ]
21
+
22
+ attr_accessor(*ATTRS)
23
+
24
+ def self.from_hash(hash)
25
+ suite = self.new
26
+ hash.each do |k, v|
27
+ sym = Util.underscore(k).to_sym
28
+ if ATTRS.include?(sym)
29
+ suite.send("#{sym}=", v)
30
+ else
31
+ raise ArgumentError, "Unknown key #{k.inspect} (#{sym.inspect})"
32
+ end
33
+ end
34
+ suite
35
+ end
36
+
37
+ end # Suite
38
+
39
+ end # Details
40
+
41
+ end # EndpointData
42
+
43
+ end # SslLabs
@@ -0,0 +1,77 @@
1
+ require 'ssl_labs/endpoint_data/details/cert'
2
+ require 'ssl_labs/endpoint_data/details/chain'
3
+ require 'ssl_labs/endpoint_data/details/key'
4
+ require 'ssl_labs/endpoint_data/details/protocol'
5
+ require 'ssl_labs/endpoint_data/details/suite'
6
+ require 'ssl_labs/endpoint_data/details/sim'
7
+ require 'ssl_labs/util'
8
+
9
+ class SslLabs
10
+
11
+ class EndpointData
12
+
13
+ class Details
14
+
15
+ ATTRS = [
16
+ :cert,
17
+ :chain,
18
+ :compression_methods,
19
+ :host_start_time,
20
+ :key,
21
+ :non_prefix_delegation,
22
+ :prefix_delegation,
23
+ :protocols,
24
+ :reneg_support,
25
+ :server_signature,
26
+ :session_resumption,
27
+ :suites,
28
+ :vuln_beast,
29
+ :heartbleed,
30
+ :heartbeat,
31
+ :open_ssl_ccs,
32
+ :session_tickets,
33
+ :sni_required,
34
+ :ocsp_stapling,
35
+ :supports_npn,
36
+ :supports_rc4,
37
+ :forward_secrecy,
38
+ :rc4_with_modern,
39
+ :http_status_code,
40
+ :sims
41
+ ]
42
+
43
+ attr_accessor(*ATTRS)
44
+
45
+ def self.from_hash(hash)
46
+ details = self.new
47
+ hash.each do |k, v|
48
+ sym = Util.underscore(k).to_sym
49
+ case sym
50
+ when :cert
51
+ details.cert = Cert.from_hash(v)
52
+ when :chain
53
+ details.chain = Chain.from_hash(v)
54
+ when :host_start_time
55
+ details.host_start_time = Time.at(v / 1000.0)
56
+ when :key
57
+ details.key = Key.from_hash(v)
58
+ when :protocols
59
+ details.protocols = v['list'].map { |hash| Protocol.from_hash(hash) }
60
+ when :sims
61
+ details.sims = v['results'].map { |hash| Sim.from_hash(hash) }
62
+ when :suites
63
+ details.suites = v['list'].map { |hash| Suite.from_hash(hash) }
64
+ when *ATTRS
65
+ details.send("#{sym}=", v)
66
+ else
67
+ raise ArgumentError, "Unknown key #{k.inspect} (#{sym.inspect})"
68
+ end
69
+ end
70
+ details
71
+ end
72
+
73
+ end # Details
74
+
75
+ end # EndpointData
76
+
77
+ end # SslLabs
@@ -0,0 +1,49 @@
1
+ require 'ipaddr'
2
+ require 'json'
3
+
4
+ require 'ssl_labs/util'
5
+ require 'ssl_labs/endpoint_data/details'
6
+
7
+ class SslLabs
8
+
9
+ class EndpointData
10
+
11
+ ATTRS = [
12
+ :delegation,
13
+ :details,
14
+ :duration,
15
+ :eta,
16
+ :grade,
17
+ :has_warnings,
18
+ :ip_address,
19
+ :is_exceptional,
20
+ :progress,
21
+ :server_name,
22
+ :status_message
23
+ ]
24
+
25
+ attr_accessor(*ATTRS)
26
+
27
+ def self.from_hash(hash)
28
+ endpoint = self.new
29
+ hash.each do |k, v|
30
+ sym = Util.underscore(k).to_sym
31
+ if ATTRS.include?(sym)
32
+ case sym
33
+ when :ip_address
34
+ endpoint.ip_address = IPAddr.new(v)
35
+ when :details
36
+ endpoint.details = EndpointData::Details.from_hash(v)
37
+ else
38
+ endpoint.send("#{sym}=", v)
39
+ end
40
+ else
41
+ raise ArgumentError, "Unknown key #{k.inspect} (#{sym})"
42
+ end
43
+ end
44
+ endpoint
45
+ end
46
+
47
+ end # EndpointData
48
+
49
+ end # SslLabs
@@ -0,0 +1,58 @@
1
+ require 'ssl_labs/endpoint'
2
+ require 'ssl_labs/util'
3
+
4
+ class SslLabs
5
+
6
+ class Host
7
+
8
+ ATTRS = [
9
+ :criteria_version,
10
+ :delegation,
11
+ :duration,
12
+ :endpoints,
13
+ :engine_version,
14
+ :eta,
15
+ :grade,
16
+ :has_warnings,
17
+ :host,
18
+ :is_exceptional,
19
+ :is_public,
20
+ :port,
21
+ :progress,
22
+ :protocol,
23
+ :start_time,
24
+ :status,
25
+ :status_message,
26
+ :test_time
27
+ ]
28
+
29
+ attr_accessor(*ATTRS)
30
+
31
+ def initialize
32
+ @endpoints = []
33
+ end
34
+
35
+ def self.from_json(str)
36
+ json = JSON.parse(str)
37
+ host = self.new
38
+ json.each do |k, v|
39
+ sym = Util.underscore(k).to_sym
40
+ if ATTRS.include?(sym)
41
+ case sym
42
+ when :start_time
43
+ host.start_time = Time.at(v / 1000.0)
44
+ when :endpoints
45
+ host.endpoints += v.map { |ep| Endpoint.from_hash(ep) }
46
+ else
47
+ host.send("#{sym}=", v)
48
+ end
49
+ else
50
+ raise ArgumentError, "Unknown JSON key #{k.inspect} (#{sym.inspect})"
51
+ end
52
+ end
53
+ host
54
+ end
55
+
56
+ end # Host
57
+
58
+ end # SslLabs
@@ -0,0 +1,41 @@
1
+ require 'json'
2
+
3
+ class SslLabs
4
+
5
+ class Info
6
+
7
+ ATTRS = [
8
+ :engine_version,
9
+ :criteria_version,
10
+ :client_max_assessments
11
+ ]
12
+
13
+ attr_accessor(*ATTRS)
14
+
15
+ # Create an Info from a JSON object.
16
+ def self.from_json(str)
17
+ json = JSON.parse(str)
18
+ info = self.new
19
+ json.each do |k, v|
20
+ case k
21
+ when 'engineVersion'
22
+ info.engine_version = v
23
+ when 'criteriaVersion'
24
+ info.criteria_version = v
25
+ when 'clientMaxAssessments'
26
+ info.client_max_assessments = v.to_i
27
+ else
28
+ raise ArgumentError, "Unknown key #{k.inspect}"
29
+ end
30
+ info
31
+ end
32
+ end
33
+
34
+ # Convert an Info to a Hash.
35
+ def to_hash
36
+ Hash[*ATTRS.map { |attr| [attr, self.send(attr)] }]
37
+ end
38
+
39
+ end # Info
40
+
41
+ end # SslLabs
@@ -0,0 +1,22 @@
1
+ require 'active_support/inflector'
2
+
3
+ class SslLabs
4
+
5
+ # Utility methods.
6
+ module Util
7
+
8
+ # Camelizes a snake case method or argument name.
9
+ # For example "get_status_codes" -> GetStatusCodes'.
10
+ def self.camelize(snake)
11
+ snake.to_s.camelize(:lower)
12
+ end
13
+
14
+ # Snake cases a method or argument name.
15
+ # For example "getStatusCodes" -> 'get_status_codes'.
16
+ def self.underscore(camel)
17
+ camel.to_s.underscore
18
+ end
19
+
20
+ end # Util
21
+
22
+ end # SslLabs
data/lib/ssl_labs.rb ADDED
@@ -0,0 +1,93 @@
1
+ require 'mechanize'
2
+ require 'uri'
3
+
4
+ require 'ssl_labs/api'
5
+ require 'ssl_labs/endpoint_data'
6
+ require 'ssl_labs/host'
7
+ require 'ssl_labs/info'
8
+
9
+ class SslLabs
10
+
11
+ # Gem version.
12
+ VERSION = '0.0.1'
13
+
14
+ # User agent for client.
15
+ USER_AGENT = "ssl_labs.rb #{VERSION}"
16
+
17
+ # Seconds to delay between analysis polls.
18
+ POLL_SLEEP = 10
19
+
20
+ attr_accessor :uri
21
+ attr_accessor :agent
22
+
23
+ def initialize(uri=nil)
24
+ @uri = URI(uri) unless uri.nil?
25
+ @agent = Mechanize.new
26
+ @agent.user_agent = USER_AGENT
27
+ end
28
+
29
+ # Run the analyze method and return immediately with Host response
30
+ # from the server. Do not wait for analysis to complete.
31
+ def analyze(opts={})
32
+ defaults = {:host => uri.host}
33
+ opts_a = opts.flat_map do |k, v|
34
+ case k
35
+ when :publish, :clear_cache, :from_cache
36
+ [k, v ? 'on' : 'off']
37
+ when :all
38
+ if v == true
39
+ [k, 'on']
40
+ elsif v == :done
41
+ [k, v]
42
+ else
43
+ raise ArgumentError, "Invalid value for option #{k.inspect}"
44
+ end
45
+ else
46
+ raise ArgumentError, "Invalid option #{k.inspect}"
47
+ end
48
+ end
49
+ json = invoke(:analyze, defaults.merge(Hash[*opts_a]))
50
+ Host.from_json(json)
51
+ end
52
+
53
+ # Clears the cache and blocks until analyze returns results.
54
+ # Returns an Array of SslLabs::EndpointData.
55
+ def analyze!
56
+ host = analyze(:clear_cache => true)
57
+ loop do
58
+ sleep(POLL_SLEEP)
59
+ host = analyze
60
+ break if %w{READY ERROR}.include?(host.status)
61
+ end
62
+ host.endpoints.map { |ep| endpoint_data(ep) }
63
+ end
64
+
65
+ # Return EndpointData from an EndPoint.
66
+ def endpoint_data(ep, from_cache=false)
67
+ body = invoke(:get_endpoint_data,
68
+ :host => uri.host,
69
+ :s => ep.ip_address,
70
+ :from_cache => from_cache ? 'on' : 'off')
71
+ EndpointData.from_json(body)
72
+ end
73
+
74
+ # Return an Info object.
75
+ def info
76
+ body = invoke(:info)
77
+ Info.from_json(body)
78
+ end
79
+
80
+ # Return a Hash of status codes (String => String).
81
+ def status_codes
82
+ body = invoke(:get_status_codes)
83
+ json = JSON.parse(body)
84
+ json['statusDetails']
85
+ end
86
+
87
+ # Return the Mechanize::Page body for the given method and arguments.
88
+ def invoke(method, args={})
89
+ url = Api.url(method, args)
90
+ @agent.get(url).body
91
+ end
92
+
93
+ end # SslLabs
@@ -0,0 +1,153 @@
1
+ {"ipAddress":"69.58.181.89","serverName":"www-ilg.verisign.net",
2
+ "statusMessage":"Ready","grade":"B","hasWarnings":true,"isExceptional":
3
+ false,"progress":100,"duration":44127,"eta":1,"delegation":3,"details":{
4
+ "hostStartTime":1414709783093,"key":{"size":2048,"alg":"RSA",
5
+ "debianFlaw":false,"strength":2048},"cert":{"subject":
6
+ "CN\u003dwww.verisign.com,OU\u003dInfrastructure Operations ,O\u003dSymantec Corporation,STREET\u003d350 Ellis Street,L\u003dMountain View,ST\u003dCalifornia,2.5.4.17\u003d#14053934303433,C\u003dUS,2.5.4.5\u003d#130732313538313133,2.5.4.15\u003d#131450726976617465204f7267616e697a6174696f6e,1.3.6.1.4.1.311.60.2.1.2\u003d#130844656c6177617265,1.3.6.1.4.1.311.60.2.1.3\u003d#13025553",
7
+ "commonNames":["www.verisign.com"],"altNames":["www.verisign.com",
8
+ "verisign.com","www.verisign.net","verisign.net",
9
+ "www.verisign.mobi","verisign.mobi","www.verisign.eu",
10
+ "verisign.eu","forms.ws.symantec.com","sslreview.com",
11
+ "www.sslreview.com","www.symauth.com"],"notBefore":1389830400000,
12
+ "notAfter":1452988799000,"issuerSubject":
13
+ "CN\u003dVeriSign Class 3 Extended Validation SSL SGC CA,OU\u003dTerms of use at https://www.verisign.com/rpa (c)06,OU\u003dVeriSign Trust Network,O\u003dVeriSign, Inc.,C\u003dUS",
14
+ "sigAlg":"SHA1withRSA","issuerLabel":
15
+ "VeriSign Class 3 Extended Validation SSL SGC CA","revocationInfo":3,
16
+ "crlURIs":["http://EVIntl-crl.verisign.com/EVIntl2006.crl"],"ocspURIs":
17
+ ["http://EVIntl-ocsp.verisign.com"],"revocationStatus":2,"scg":1,
18
+ "validationType":"E","issues":0},"chain":{"certs":[{"subject":
19
+ "CN\u003dwww.verisign.com,OU\u003dInfrastructure Operations ,O\u003dSymantec Corporation,STREET\u003d350 Ellis Street,L\u003dMountain View,ST\u003dCalifornia,2.5.4.17\u003d#14053934303433,C\u003dUS,2.5.4.5\u003d#130732313538313133,2.5.4.15\u003d#131450726976617465204f7267616e697a6174696f6e,1.3.6.1.4.1.311.60.2.1.2\u003d#130844656c6177617265,1.3.6.1.4.1.311.60.2.1.3\u003d#13025553",
20
+ "label":"www.verisign.com","issuerSubject":
21
+ "CN\u003dVeriSign Class 3 Extended Validation SSL SGC CA,OU\u003dTerms of use at https://www.verisign.com/rpa (c)06,OU\u003dVeriSign Trust Network,O\u003dVeriSign, Inc.,C\u003dUS",
22
+ "issuerLabel":"VeriSign Class 3 Extended Validation SSL SGC CA",
23
+ "raw":
24
+ "-----BEGIN CERTIFICATE-----\nMIIG0jCCBbqgAwIBAgIQRHT74McgkNIJ4CcjNXxCZzANBgkqhkiG9w0BAQUFADCBvjELMAkGA1UE\r\nBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\r\nZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29t\r\nL3JwYSAoYykwNjE4MDYGA1UEAxMvVmVyaVNpZ24gQ2xhc3MgMyBFeHRlbmRlZCBWYWxpZGF0aW9u\r\nIFNTTCBTR0MgQ0EwHhcNMTQwMTE2MDAwMDAwWhcNMTYwMTE2MjM1OTU5WjCCASYxEzARBgsrBgEE\r\nAYI3PAIBAxMCVVMxGTAXBgsrBgEEAYI3PAIBAhMIRGVsYXdhcmUxHTAbBgNVBA8TFFByaXZhdGUg\r\nT3JnYW5pemF0aW9uMRAwDgYDVQQFEwcyMTU4MTEzMQswCQYDVQQGEwJVUzEOMAwGA1UEERQFOTQw\r\nNDMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcUDU1vdW50YWluIFZpZXcxGTAXBgNVBAkU\r\nEDM1MCBFbGxpcyBTdHJlZXQxHTAbBgNVBAoUFFN5bWFudGVjIENvcnBvcmF0aW9uMSQwIgYDVQQL\r\nFBtJbmZyYXN0cnVjdHVyZSBPcGVyYXRpb25zICAxGTAXBgNVBAMUEHd3dy52ZXJpc2lnbi5jb20w\r\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrG90iUEhTlnwtoAfqXUHUPBQo3JEKBWEe\r\nwf8/71RFR0O6J5mxF88ODxs/HRGK1wrd8WClqnhMBsvITNB9m+escDpBWpwGNZp4TaYW9HxxtZ7h\r\neaeJjso8M/k3NHdXuFsuPw5L8xxOv9aI0H87LMmImenLxCRmpJQNAKe+jfNTqpuK1tUEYdLzR0n4\r\nu76ZDcGSYSplbCjLcamLTHAhijQQWiUgWC0fUnm4z2zyzT4QwzXIfuf7BCSLfCGY3/KuKO4vybti\r\nUg6ALqMW3JjA149r6DHjIkibwq2wJhFnspm74y0wJq3GE5avUyUrz8XoXexSJPTRuz6jyVayEXeD\r\nZvcJAgMBAAGjggJfMIICWzCB1QYDVR0RBIHNMIHKghB3d3cudmVyaXNpZ24uY29tggx2ZXJpc2ln\r\nbi5jb22CEHd3dy52ZXJpc2lnbi5uZXSCDHZlcmlzaWduLm5ldIIRd3d3LnZlcmlzaWduLm1vYmmC\r\nDXZlcmlzaWduLm1vYmmCD3d3dy52ZXJpc2lnbi5ldYILdmVyaXNpZ24uZXWCFWZvcm1zLndzLnN5\r\nbWFudGVjLmNvbYINc3NscmV2aWV3LmNvbYIRd3d3LnNzbHJldmlldy5jb22CD3d3dy5zeW1hdXRo\r\nLmNvbTAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIFoDAoBgNVHSUEITAfBggrBgEFBQcDAQYIKwYB\r\nBQUHAwIGCWCGSAGG+EIEATBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBxcGMCowKAYIKwYBBQUHAgEW\r\nHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9jcHMwHQYDVR0OBBYEFFhbQy8r9duhEyHt180crp3U\r\nFY8gMB8GA1UdIwQYMBaAFE5DyB127zdTek/yWG+U8zji1b3fMD4GA1UdHwQ3MDUwM6AxoC+GLWh0\r\ndHA6Ly9FVkludGwtY3JsLnZlcmlzaWduLmNvbS9FVkludGwyMDA2LmNybDB2BggrBgEFBQcBAQRq\r\nMGgwKwYIKwYBBQUHMAGGH2h0dHA6Ly9FVkludGwtb2NzcC52ZXJpc2lnbi5jb20wOQYIKwYBBQUH\r\nMAKGLWh0dHA6Ly9FVkludGwtYWlhLnZlcmlzaWduLmNvbS9FVkludGwyMDA2LmNlcjANBgkqhkiG\r\n9w0BAQUFAAOCAQEAPSZt7qa0z7AbV78LQ20T2c587Pb389khyLLyxQSx/nKqtYIs0sH9qvsdrqEk\r\n3ThUYbTfI4Owh0a87uCCpBTPf/1c1581waHoId7VibSq3IwR71RPhSJu9zmLJ/GSjs/NWcVgbpUI\r\n7JRQlyqffVmMn3w3La/NZBSXspFSMzmDG0G+hUZJJYPabrfinsedFav2e5BihDgGISbMhxeXGuSs\r\nQYLbOF8B9JPUwgBnDCO6IgKGeww+Zb3Uh1FBmCydpZlP4Qn8tkaegGMXtlv4rzdt7wtKpELSbhot\r\nQHlWr06hD9XUlh7UOBvShhM7UDhMFUQ0HjLf/9A11pb71CRaoHfFbQ\u003d\u003d\r\n-----END CERTIFICATE-----\n"},
25
+ {"subject":
26
+ "CN\u003dVeriSign Class 3 Extended Validation SSL SGC CA,OU\u003dTerms of use at https://www.verisign.com/rpa (c)06,OU\u003dVeriSign Trust Network,O\u003dVeriSign, Inc.,C\u003dUS",
27
+ "label":"VeriSign Class 3 Extended Validation SSL SGC CA",
28
+ "issuerSubject":
29
+ "CN\u003dVeriSign Class 3 Public Primary Certification Authority - G5,OU\u003d(c) 2006 VeriSign, Inc. - For authorized use only,OU\u003dVeriSign Trust Network,O\u003dVeriSign, Inc.,C\u003dUS",
30
+ "issuerLabel":
31
+ "VeriSign Class 3 Public Primary Certification Authority - G5",
32
+ "raw":
33
+ "-----BEGIN CERTIFICATE-----\nMIIGHjCCBQagAwIBAgIQLEjdkw31WY75PJlUemDtQzANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\r\nBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO\r\nZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk\r\nIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp\r\nZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMTYxMTA3MjM1OTU5WjCB\r\nvjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln\r\nbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cudmVy\r\naXNpZ24uY29tL3JwYSAoYykwNjE4MDYGA1UEAxMvVmVyaVNpZ24gQ2xhc3MgMyBFeHRlbmRlZCBW\r\nYWxpZGF0aW9uIFNTTCBTR0MgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9Voi6\r\niDRkZM/NyrDu5xlzxXLZu0W8taj/g74cA9vtibcuEBolvFXKQaGfC88ZXnC5XjlLnjEcX4euKqqo\r\nK6IbOxAjXxOx3QiMThTag4HjtYzjaO0kZ85Wtqybc5ZE24qMs9bwcZOO23FUSutzWWqPcFEsA5+X\r\n0cwRerxiDZUqyRx1V+n1x+q6hDXLx4VafuRN4RGXfQ4gNEXb8aIJ6+s9nriWQ140SwglHkMaotm3\r\nigE0PcP45a9PjP/NZfAjTsWXs1zakByChQ0GDcEitnsopAPDTFPRWLxyvAg5/KB2qKjpS26IPeOz\r\nMSWMcylIDjJ5Bu09Q/T25On8fb6OCNUfAgMBAAGjggIIMIICBDAdBgNVHQ4EFgQUTkPIHXbvN1N6\r\nT/JYb5TzOOLVvd8wEgYDVR0TAQH/BAgwBgEB/wIBADA9BgNVHSAENjA0MDIGBFUdIAAwKjAoBggr\r\nBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL2NwczA9BgNVHR8ENjA0MDKgMKAuhixo\r\ndHRwOi8vRVZTZWN1cmUtY3JsLnZlcmlzaWduLmNvbS9wY2EzLWc1LmNybDAOBgNVHQ8BAf8EBAMC\r\nAQYwEQYJYIZIAYb4QgEBBAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dp\r\nZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlz\r\naWduLmNvbS92c2xvZ28uZ2lmMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFDbGFzczNDQTIwNDgt\r\nMS00ODAfBgNVHSMEGDAWgBR/02Wnwt3su/AwCfNDOfoCrzMxMzA9BggrBgEFBQcBAQQxMC8wLQYI\r\nKwYBBQUHMAGGIWh0dHA6Ly9FVlNlY3VyZS1vY3NwLnZlcmlzaWduLmNvbTA0BgNVHSUELTArBglg\r\nhkgBhvhCBAEGCmCGSAGG+EUBCAEGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQUFAAOC\r\nAQEAJ3SmNOodneFT1hydDKdbTKln8vAytwEP+0IYON7k7knIE8kL7ATDQHEYcnZDAiNdq3vISBQa\r\nyHsd/PYKnzah0glzcWaWdVE0v5kwUWedVLcmRaxzCCOGJplx9I7X6jmbBgkjv2LdqMS2faSJBz7z\r\nba5AWVB5lzc9Mnh9smNL+eoIaQ4T7ejPu6wFhsoiz4hiXTwiSdhj1SSmve9c48wgOyLq/ETGqOUf\r\n4YbNDE2Pk1PZf+6hCKezMJZJcG6jbD3QY+8lZmPMqrcYF07qcHb2ukKmgDcJTp9miC5rM2bIwHGk\r\nQeta4/wULkuI/a5uW2XpJ+S/5LAjwbJ9W2Il1z4Q1A\u003d\u003d\r\n-----END CERTIFICATE-----\n"},
34
+ {"subject":
35
+ "CN\u003dVeriSign Class 3 Public Primary Certification Authority - G5,OU\u003d(c) 2006 VeriSign, Inc. - For authorized use only,OU\u003dVeriSign Trust Network,O\u003dVeriSign, Inc.,C\u003dUS",
36
+ "label":
37
+ "VeriSign Class 3 Public Primary Certification Authority - G5",
38
+ "issuerSubject":
39
+ "OU\u003dClass 3 Public Primary Certification Authority,O\u003dVeriSign, Inc.,C\u003dUS",
40
+ "issuerLabel":"Class 3 Public Primary Certification Authority",
41
+ "raw":
42
+ "-----BEGIN CERTIFICATE-----\nMIIExjCCBC+gAwIBAgIQNZcxh/OHOgcyfs5YDJt+2jANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQG\r\nEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDMgUHVibGljIFBy\r\naW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYxMTA4MDAwMDAwWhcNMjExMTA3MjM1\r\nOTU5WjCByjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\r\nZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAt\r\nIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1Ymxp\r\nYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUA\r\nA4IBDwAwggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i\r\n6CqqpkKzj/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/Wh\r\nkcIzSdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA\r\n5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxp\r\ng8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjggGRMIIBjTAP\r\nBgNVHRMBAf8EBTADAQH/MDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNpZ24uY29t\r\nL3BjYTMuY3JsMA4GA1UdDwEB/wQEAwIBBjA9BgNVHSAENjA0MDIGBFUdIAAwKjAoBggrBgEFBQcC\r\nARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL2NwczAdBgNVHQ4EFgQUf9Nlp8Ld7LvwMAnzQzn6\r\nAq8zMTMwNAYDVR0lBC0wKwYJYIZIAYb4QgQBBgpghkgBhvhFAQgBBggrBgEFBQcDAQYIKwYBBQUH\r\nAwIwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XT\r\nGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYw\r\nNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC52ZXJpc2lnbi5jb20wDQYJ\r\nKoZIhvcNAQEFBQADgYEADyWuSO0bM4VMDLXC1/5N1oMoTEFlYAALd0hxgv5/21oOIMzS6ke8ZEJh\r\nRDR0MIGBJopK90RdfjSAqLiD4gnXbSPdie0oCL1jWhFXCMSe2uJoKK/dUDzsgiHYAMJVRFBwQa2D\r\nF3m6CPMr3u00HUSe0gST9MsFFy0JLS1j7/YmC3s\u003d\r\n-----END CERTIFICATE-----\n"}],
43
+ "issues":4},"protocols":{"list":[{"id":769,"name":"TLS","version":
44
+ "1.0"}]},"suites":{"list":[{"id":9,"name":
45
+ "TLS_RSA_WITH_DES_CBC_SHA","cipherStrength":56,"q":0},{"id":21,
46
+ "name":"TLS_DHE_RSA_WITH_DES_CBC_SHA","cipherStrength":56,
47
+ "dhStrength":1024,"dhP":128,"dhG":1,"dhYs":128,"q":0},{"id":4,
48
+ "name":"TLS_RSA_WITH_RC4_128_MD5","cipherStrength":128},{"id":5,
49
+ "name":"TLS_RSA_WITH_RC4_128_SHA","cipherStrength":128},{"id":47,
50
+ "name":"TLS_RSA_WITH_AES_128_CBC_SHA","cipherStrength":128},{"id":
51
+ 51,"name":"TLS_DHE_RSA_WITH_AES_128_CBC_SHA","cipherStrength":
52
+ 128,"dhStrength":1024,"dhP":128,"dhG":1,"dhYs":128},{"id":65,
53
+ "name":"TLS_RSA_WITH_CAMELLIA_128_CBC_SHA","cipherStrength":128},{
54
+ "id":69,"name":"TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA",
55
+ "cipherStrength":128,"dhStrength":1024,"dhP":128,"dhG":1,"dhYs":
56
+ 128},{"id":150,"name":"TLS_RSA_WITH_SEED_CBC_SHA","cipherStrength":
57
+ 128},{"id":154,"name":"TLS_DHE_RSA_WITH_SEED_CBC_SHA",
58
+ "cipherStrength":128,"dhStrength":1024,"dhP":128,"dhG":1,"dhYs":
59
+ 128},{"id":10,"name":"TLS_RSA_WITH_3DES_EDE_CBC_SHA",
60
+ "cipherStrength":168},{"id":22,"name":
61
+ "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA","cipherStrength":168,
62
+ "dhStrength":1024,"dhP":128,"dhG":1,"dhYs":128},{"id":53,"name":
63
+ "TLS_RSA_WITH_AES_256_CBC_SHA","cipherStrength":256},{"id":57,
64
+ "name":"TLS_DHE_RSA_WITH_AES_256_CBC_SHA","cipherStrength":256,
65
+ "dhStrength":1024,"dhP":128,"dhG":1,"dhYs":128},{"id":132,"name":
66
+ "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA","cipherStrength":256},{"id":
67
+ 136,"name":"TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA",
68
+ "cipherStrength":256,"dhStrength":1024,"dhP":128,"dhG":1,"dhYs":
69
+ 128}],"preference":false},"serverSignature":"Apache",
70
+ "prefixDelegation":true,"nonPrefixDelegation":true,"vulnBeast":true,
71
+ "renegSupport":2,"sessionResumption":2,"compressionMethods":0,
72
+ "supportsNpn":false,"sessionTickets":1,"ocspStapling":false,
73
+ "sniRequired":false,"httpStatusCode":200,"supportsRc4":true,
74
+ "forwardSecrecy":1,"rc4WithModern":false,"sims":{"results":[{"client":{
75
+ "id":56,"name":"Android","version":"2.3.7","isReference":false},
76
+ "errorCode":0,"attempts":1,"protocolId":769,"suiteId":4},{"client":
77
+ {"id":58,"name":"Android","version":"4.0.4","isReference":false},
78
+ "errorCode":0,"attempts":1,"protocolId":769,"suiteId":57},{
79
+ "client":{"id":59,"name":"Android","version":"4.1.1","isReference":
80
+ false},"errorCode":0,"attempts":1,"protocolId":769,"suiteId":
81
+ 57},{"client":{"id":60,"name":"Android","version":"4.2.2",
82
+ "isReference":false},"errorCode":0,"attempts":1,"protocolId":
83
+ 769,"suiteId":57},{"client":{"id":61,"name":"Android","version":
84
+ "4.3","isReference":false},"errorCode":0,"attempts":1,
85
+ "protocolId":769,"suiteId":57},{"client":{"id":62,"name":
86
+ "Android","version":"4.4.2","isReference":false},"errorCode":0,
87
+ "attempts":1,"protocolId":769,"suiteId":57},{"client":{"id":41,
88
+ "name":"BingBot","version":"Dec 2013","isReference":false},
89
+ "errorCode":0,"attempts":1,"protocolId":769,"suiteId":47},{
90
+ "client":{"id":74,"name":"BingPreview","version":"Jun 2014",
91
+ "isReference":false},"errorCode":0,"attempts":1,"protocolId":
92
+ 769,"suiteId":57},{"client":{"id":80,"name":"Chrome","platform":
93
+ "OS X","version":"37","isReference":true},"errorCode":0,
94
+ "attempts":1,"protocolId":769,"suiteId":51},{"client":{"id":48,
95
+ "name":"Firefox","platform":"Win 7","version":"24.2.0 ESR",
96
+ "isReference":false},"errorCode":0,"attempts":1,"protocolId":
97
+ 769,"suiteId":136},{"client":{"id":79,"name":"Firefox","platform":
98
+ "OS X","version":"32","isReference":true},"errorCode":0,
99
+ "attempts":1,"protocolId":769,"suiteId":51},{"client":{"id":72,
100
+ "name":"Googlebot","version":"Jun 2014","isReference":false},
101
+ "errorCode":0,"attempts":1,"protocolId":769,"suiteId":5},{"client":
102
+ {"id":18,"name":"IE","platform":"XP","version":"6","isReference":
103
+ false},"errorCode":1,"attempts":1},{"client":{"id":19,"name":
104
+ "IE","platform":"Vista","version":"7","isReference":false},
105
+ "errorCode":0,"attempts":1,"protocolId":769,"suiteId":47},{
106
+ "client":{"id":20,"name":"IE","platform":"XP","version":"8",
107
+ "isReference":false},"errorCode":0,"attempts":1,"protocolId":
108
+ 769,"suiteId":4},{"client":{"id":23,"name":"IE","platform":
109
+ "Win 7","version":"8-10","isReference":true},"errorCode":0,
110
+ "attempts":1,"protocolId":769,"suiteId":47},{"client":{"id":23,
111
+ "name":"IE","platform":"Win 7","version":"11","isReference":
112
+ true},"errorCode":0,"attempts":1,"protocolId":769,"suiteId":47},{
113
+ "client":{"id":71,"name":"IE","platform":"Win 8.1","version":
114
+ "11","isReference":true},"errorCode":0,"attempts":1,"protocolId":
115
+ 769,"suiteId":53},{"client":{"id":81,"name":"IE","platform":
116
+ "Win 10 Preview","version":"11","isReference":true},"errorCode":
117
+ 0,"attempts":1,"protocolId":769,"suiteId":53},{"client":{"id":64,
118
+ "name":"IE Mobile","platform":"Win Phone 8.0","version":"10",
119
+ "isReference":false},"errorCode":0,"attempts":1,"protocolId":
120
+ 769,"suiteId":47},{"client":{"id":65,"name":"IE Mobile","platform":
121
+ "Win Phone 8.1","version":"11","isReference":false},"errorCode":
122
+ 0,"attempts":1,"protocolId":769,"suiteId":47},{"client":{"id":25,
123
+ "name":"Java","version":"6u45","isReference":false},"errorCode":
124
+ 0,"attempts":1,"protocolId":769,"suiteId":4},{"client":{"id":26,
125
+ "name":"Java","version":"7u25","isReference":false},"errorCode":
126
+ 0,"attempts":1,"protocolId":769,"suiteId":47},{"client":{"id":53,
127
+ "name":"Java","version":"8b132","isReference":false},"errorCode":
128
+ 0,"attempts":1,"protocolId":769,"suiteId":47},{"client":{"id":27,
129
+ "name":"OpenSSL","version":"0.9.8y","isReference":false},
130
+ "errorCode":0,"attempts":1,"protocolId":769,"suiteId":57},{
131
+ "client":{"id":28,"name":"OpenSSL","version":"1.0.1h",
132
+ "isReference":false},"errorCode":0,"attempts":1,"protocolId":
133
+ 769,"suiteId":57},{"client":{"id":32,"name":"Safari","platform":
134
+ "OS X 10.6.8","version":"5.1.9","isReference":false},"errorCode":
135
+ 0,"attempts":1,"protocolId":769,"suiteId":47},{"client":{"id":33,
136
+ "name":"Safari","platform":"iOS 6.0.1","version":"6",
137
+ "isReference":true},"errorCode":0,"attempts":1,"protocolId":
138
+ 769,"suiteId":47},{"client":{"id":63,"name":"Safari","platform":
139
+ "iOS 7.1","version":"7","isReference":true},"errorCode":0,
140
+ "attempts":1,"protocolId":769,"suiteId":47},{"client":{"id":75,
141
+ "name":"Safari","platform":"iOS 8.0 Beta","version":"8",
142
+ "isReference":true},"errorCode":0,"attempts":1,"protocolId":
143
+ 769,"suiteId":57},{"client":{"id":34,"name":"Safari","platform":
144
+ "OS X 10.8.4","version":"6.0.4","isReference":true},"errorCode":
145
+ 0,"attempts":1,"protocolId":769,"suiteId":47},{"client":{"id":35,
146
+ "name":"Safari","platform":"OS X 10.9","version":"7",
147
+ "isReference":true},"errorCode":0,"attempts":1,"protocolId":
148
+ 769,"suiteId":47},{"client":{"id":73,"name":"Yahoo Slurp",
149
+ "version":"Jun 2014","isReference":false},"errorCode":0,
150
+ "attempts":1,"protocolId":769,"suiteId":57},{"client":{"id":78,
151
+ "name":"YandexBot","version":"Sep 2014","isReference":false},
152
+ "errorCode":0,"attempts":1,"protocolId":769,"suiteId":57}]},
153
+ "heartbleed":false,"heartbeat":false,"openSslCcs":2}}
@@ -0,0 +1,17 @@
1
+ require 'json'
2
+ #require 'pry'
3
+ require 'test/unit'
4
+
5
+ require 'ssl_labs'
6
+
7
+ class TestEndpointData < Test::Unit::TestCase
8
+
9
+ def test_constructor
10
+ json = File.read(File.join(File.dirname(__FILE__), 'endpoint_data.json'))
11
+ hash = JSON.parse(json)
12
+ epd = SslLabs::EndpointData.from_hash(hash)
13
+ # XXX insert tests here
14
+ #binding.pry
15
+ end
16
+
17
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ssl_labs
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Martin Carpenter
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mechanize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.8.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.8.1
41
+ description: A gem to interface with ssllabs.com scanner
42
+ email: mcarpenter@free.fr
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files:
46
+ - Rakefile
47
+ - README.md
48
+ files:
49
+ - lib/ssl_labs.rb
50
+ - lib/ssl_labs/api.rb
51
+ - lib/ssl_labs/endpoint.rb
52
+ - lib/ssl_labs/endpoint_data.rb
53
+ - lib/ssl_labs/endpoint_data/details.rb
54
+ - lib/ssl_labs/endpoint_data/details/cert.rb
55
+ - lib/ssl_labs/endpoint_data/details/chain.rb
56
+ - lib/ssl_labs/endpoint_data/details/key.rb
57
+ - lib/ssl_labs/endpoint_data/details/protocol.rb
58
+ - lib/ssl_labs/endpoint_data/details/sim.rb
59
+ - lib/ssl_labs/endpoint_data/details/sim/client.rb
60
+ - lib/ssl_labs/endpoint_data/details/suite.rb
61
+ - lib/ssl_labs/host.rb
62
+ - lib/ssl_labs/info.rb
63
+ - lib/ssl_labs/util.rb
64
+ - test/endpoint_data.json
65
+ - test/test_endpoint_data.rb
66
+ - Rakefile
67
+ - README.md
68
+ homepage: https://github.com/mcarpenter/ssl_labs.rb
69
+ licenses:
70
+ - Apache 2.0
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 2.0.3
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: ssllabs.com SSL/TLS vulnerability scanning client
92
+ test_files:
93
+ - test/test_endpoint_data.rb