instrumental_agent 2.1.0 → 3.0.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 95eafa56c7f6a610405a68634bd590c76d81a332
4
- data.tar.gz: 5a1d84b622e6eb7cc931c2b29c170113fb3fdb6f
2
+ SHA256:
3
+ metadata.gz: a45dc47aabd6ade8ea7198ea34f4bbc205a4979b1cae1ed18dbfabb4109df0b8
4
+ data.tar.gz: 67ebcbf6fca85da2087e6196dbcf57752ebe3470411c54241487ce834c2f5cf7
5
5
  SHA512:
6
- metadata.gz: 77e15be11d00e7b900461a5321304ea8c39db039e2cdea298b2f1e6095986476d10d5f45ddfa457c26caa6fc26a41a0b515c62fa62802c3d323d529d4b917635
7
- data.tar.gz: e9347c78c125ebc12a86970425d16e8c682a4355f8fe58e360edf23a7938e004ea6765d103970f2f57205cb6d163f59016574934c1548f10d35e4f5782108cde
6
+ metadata.gz: 1bfe306e6511e588aa58a258510b18f79fe4b70180b7ee8bd4fea0b967d80cf8cab3765228b4cd385f99537704557f918d92972b9cf6da0b646225b4a5c6bd87
7
+ data.tar.gz: feaf73f66d1ed593936bcd3aecf4e0ebccbc67fcf104905e28ad67e9d4e14575a0a3259a5c1fc9b2ac21ef212c2be64910c757bfc931668b48799d3466eeacc8
@@ -1 +1 @@
1
- 2.0.0-p648
1
+ 2.6.3
@@ -1,8 +1,6 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.0.0-p648
5
- - 2.1.5
6
- - 2.2.3
7
- - 2.3.0
8
- - 2.4.0
4
+ - 2.4.6
5
+ - 2.5.5
6
+ - 2.6.3
@@ -1,3 +1,9 @@
1
+ ### 3.0.0.alpha [August 22, 2019]
2
+ * Drop support for outdated versions of Ruby
3
+ * Explicitly add support for new versions of Ruby
4
+ * Better handling of SSL errors when connecting to Instrumental
5
+ * Note: the agent API has NOT changed. This is a major release because of the significant changes in Ruby versions officially supported.
6
+
1
7
  ### 2.1.0 [January 19, 2018]
2
8
  * Add support for capistrano 3
3
9
 
data/Gemfile CHANGED
@@ -1,11 +1,6 @@
1
1
  source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
- ruby_engine = defined?(RUBY_ENGINE) && RUBY_ENGINE
5
- if RUBY_VERSION < "1.9" && !%w{jruby rbx}.include?(ruby_engine)
6
- # Built and installed via ext/mkrf_conf.rb
7
- gem 'system_timer', '~> 1.2'
8
- end
9
4
 
10
5
  # fixes 2.3.0 ffi bundle error
11
- gem 'ffi', '~> 1.0.11'
6
+ gem 'ffi', '~> 1.0.11'
@@ -4,13 +4,13 @@ require "instrumental/version"
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "instrumental_agent"
6
6
  s.version = Instrumental::VERSION
7
- s.authors = ["Elijah Miller", "Christopher Zelenak", "Kristopher Chambers", "Matthew Hassfurder"]
7
+ s.authors = ["Expected Behavior"]
8
8
  s.email = ["support@instrumentalapp.com"]
9
9
  s.homepage = "http://github.com/instrumental/instrumental_agent-ruby"
10
10
  s.summary = %q{Custom metric monitoring for Ruby applications via Instrumental}
11
11
  s.description = %q{This agent supports Instrumental custom metric monitoring for Ruby applications. It provides high-data reliability at high scale, without ever blocking your process or causing an exception.}
12
12
  s.license = "MIT"
13
- s.required_ruby_version = '>= 2.0.0'
13
+ s.required_ruby_version = '>= 2.4.6'
14
14
 
15
15
  s.files = `git ls-files`.split("\n")
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -75,7 +75,6 @@ module Instrumental
75
75
  @synchronous = !!options[:synchronous]
76
76
  @pid = Process.pid
77
77
  @allow_reconnect = true
78
- @certs = certificates
79
78
  @dns_resolutions = 0
80
79
  @last_connect_at = 0
81
80
  @metrician = options[:metrician].nil? ? true : !!options[:metrician]
@@ -271,7 +270,7 @@ module Instrumental
271
270
  end
272
271
 
273
272
  def report_exception(e)
274
- logger.error "Exception occurred: #{e.message}\n#{e.backtrace.join("\n")}"
273
+ logger.error "Exception of type #{e.class} occurred:\n#{e.message}\n#{e.backtrace.join("\n")}"
275
274
  end
276
275
 
277
276
  def ipv4_address_for_host(host, port, moment_to_connect = Time.now.to_i)
@@ -350,23 +349,7 @@ module Instrumental
350
349
 
351
350
  def test_connection
352
351
  begin
353
- # In the case where the socket is an OpenSSL::SSL::SSLSocket,
354
- # on Ruby 1.8.6, 1.8.7 or 1.9.1, read_nonblock does not exist,
355
- # and so the case of testing socket liveliness via a nonblocking
356
- # read that catches a wait condition won't work.
357
- #
358
- # We grab the SSL socket's underlying IO object and perform the
359
- # non blocking read there in order to ensure the socket is still
360
- # valid
361
- if @socket.respond_to?(:read_nonblock)
362
- @socket.read_nonblock(1)
363
- elsif @socket.respond_to?(:io)
364
- # The SSL Socket may send down additional data at close time,
365
- # so we perform two nonblocking reads, one to pull any pending
366
- # data on the socket, and the second to actually perform the connection
367
- # liveliness test
368
- @socket.io.read_nonblock(1024) && @socket.io.read_nonblock(1024)
369
- end
352
+ @socket.read_nonblock(1)
370
353
  rescue *wait_exceptions
371
354
  # noop
372
355
  end
@@ -427,81 +410,85 @@ module Instrumental
427
410
  end
428
411
 
429
412
  def run_worker_loop
413
+ @failures = 0
414
+ begin
415
+ logger.info "connecting to collector"
430
416
  command_and_args = nil
431
417
  command_options = nil
432
- logger.info "connecting to collector"
433
- with_timeout(CONNECT_TIMEOUT) do
434
- @socket = open_socket(@sockaddr_in, @secure, @verify_cert)
435
- end
436
- logger.info "connected to collector at #{host}:#{port}"
437
- hello_options = {
438
- "version" => "ruby/instrumental_agent/#{VERSION}",
439
- "hostname" => HOSTNAME,
440
- "pid" => Process.pid,
441
- "runtime" => "#{defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"}/#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}",
442
- "platform" => RUBY_PLATFORM
443
- }.to_a.flatten.map { |v| v.to_s.gsub(/\s+/, "_") }.join(" ")
444
-
445
- send_with_reply_timeout "hello #{hello_options}"
446
- send_with_reply_timeout "authenticate #{@api_key}"
447
- @failures = 0
448
- loop do
449
- command_and_args, command_options = @queue.pop
450
- if command_and_args
451
- sync_resource = command_options && command_options[:sync_resource]
452
- test_connection
453
- case command_and_args
454
- when 'exit'
455
- logger.info "Exiting, #{@queue.size} commands remain"
456
- return true
457
- when 'flush'
458
- release_resource = true
459
- else
460
- logger.debug "Sending: #{command_and_args.chomp}"
461
- @socket.puts command_and_args
462
- end
463
- command_and_args = nil
464
- command_options = nil
465
- if sync_resource
466
- @sync_mutex.synchronize do
467
- sync_resource.signal
418
+ with_timeout(CONNECT_TIMEOUT) do
419
+ @socket = open_socket(@sockaddr_in, @secure, @verify_cert)
420
+ end
421
+ logger.info "connected to collector at #{host}:#{port}"
422
+ hello_options = {
423
+ "version" => "ruby/instrumental_agent/#{VERSION}",
424
+ "hostname" => HOSTNAME,
425
+ "pid" => Process.pid,
426
+ "runtime" => "#{defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"}/#{RUBY_VERSION}p#{RUBY_PATCHLEVEL}",
427
+ "platform" => RUBY_PLATFORM
428
+ }.to_a.flatten.map { |v| v.to_s.gsub(/\s+/, "_") }.join(" ")
429
+
430
+ send_with_reply_timeout "hello #{hello_options}"
431
+ send_with_reply_timeout "authenticate #{@api_key}"
432
+
433
+ loop do
434
+ command_and_args, command_options = @queue.pop
435
+ if command_and_args
436
+ sync_resource = command_options && command_options[:sync_resource]
437
+ test_connection
438
+ case command_and_args
439
+ when 'exit'
440
+ logger.info "Exiting, #{@queue.size} commands remain"
441
+ return true
442
+ when 'flush'
443
+ release_resource = true
444
+ else
445
+ logger.debug "Sending: #{command_and_args.chomp}"
446
+ @socket.puts command_and_args
447
+ end
448
+ command_and_args = nil
449
+ command_options = nil
450
+ if sync_resource
451
+ @sync_mutex.synchronize do
452
+ sync_resource.signal
453
+ end
468
454
  end
469
455
  end
470
456
  end
471
- end
472
- rescue Exception => err
473
- allow_reconnect = @allow_reconnect
474
- case err
475
- when EOFError
457
+ rescue Exception => err
458
+ allow_reconnect = @allow_reconnect
459
+ case err
460
+ when EOFError
476
461
  # nop
477
- when Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::EADDRINUSE, Timeout::Error
478
- # If the connection has been refused by Instrumental
479
- # or we cannot reach the server
480
- # or the connection state of this socket is in a race
481
- logger.error "unable to connect to Instrumental, hanging up with #{@queue.size} messages remaining"
482
- logger.debug "Exception: #{err.inspect}\n#{err.backtrace.join("\n")}"
483
- allow_reconnect = false
484
- else
485
- report_exception(err)
486
- end
487
- if allow_reconnect == false ||
488
- (command_options && command_options[:allow_reconnect] == false)
489
- logger.info "Not trying to reconnect"
490
- @failures = 0
491
- return
492
- end
493
- if command_and_args
494
- logger.debug "requeueing: #{command_and_args}"
495
- @queue << command_and_args
462
+ when Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::EADDRINUSE, Timeout::Error, OpenSSL::SSL::SSLError
463
+ # If the connection has been refused by Instrumental
464
+ # or we cannot reach the server
465
+ # or the connection state of this socket is in a race
466
+ # or SSL is not functioning properly for some reason
467
+ logger.error "unable to connect to Instrumental, hanging up with #{@queue.size} messages remaining"
468
+ logger.debug "Exception: #{err.inspect}\n#{err.backtrace.join("\n")}"
469
+ allow_reconnect = false
470
+ else
471
+ report_exception(err)
472
+ end
473
+ if allow_reconnect == false ||
474
+ (command_options && command_options[:allow_reconnect] == false)
475
+ logger.info "Not trying to reconnect"
476
+ @failures = 0
477
+ return
478
+ end
479
+ if command_and_args
480
+ logger.debug "requeueing: #{command_and_args}"
481
+ @queue << command_and_args
482
+ end
483
+ disconnect
484
+ @failures += 1
485
+ delay = [(@failures - 1) ** BACKOFF, MAX_RECONNECT_DELAY].min
486
+ logger.error "disconnected, #{@failures} failures in a row, reconnect in #{delay}..."
487
+ sleep delay
488
+ retry
489
+ ensure
490
+ disconnect
496
491
  end
497
- disconnect
498
- @failures += 1
499
- delay = [(@failures - 1) ** BACKOFF, MAX_RECONNECT_DELAY].min
500
- logger.error "disconnected, #{@failures} failures in a row, reconnect in #{delay}..."
501
- sleep delay
502
- retry
503
- ensure
504
- disconnect
505
492
  end
506
493
 
507
494
  def setup_cleanup_at_exit
@@ -541,18 +528,5 @@ module Instrumental
541
528
  def allows_secure?
542
529
  defined?(OpenSSL)
543
530
  end
544
-
545
- def certificates
546
- if allows_secure?
547
- base_dir = File.expand_path(File.join(File.dirname(__FILE__), "..", ".."))
548
- %w{equifax geotrust rapidssl}.map do |name|
549
- OpenSSL::X509::Certificate.new(File.open(File.join(base_dir, "certs", "#{name}.ca.pem")))
550
- end
551
- else
552
- []
553
- end
554
- end
555
-
556
531
  end
557
-
558
532
  end
@@ -1,3 +1,3 @@
1
1
  module Instrumental
2
- VERSION = "2.1.0"
2
+ VERSION = "3.0.0.alpha"
3
3
  end
@@ -9,6 +9,8 @@ def wait(n=0.2, &block)
9
9
  if (Time.now - start) < 5
10
10
  sleep n
11
11
  retry
12
+ else
13
+ raise ex
12
14
  end
13
15
  end
14
16
  else
@@ -226,16 +228,16 @@ shared_examples "Instrumental Agent" do
226
228
  allow(agent.logger).to receive(:debug)
227
229
  expect(agent.logger).to receive(:debug).with("Dropping command, queue full(3): increment overflow_test 4 300 1")
228
230
  expect(agent.logger).to receive(:debug).with("Dropping command, queue full(3): increment overflow_test 5 300 1")
229
- 5.times do |i|
230
- agent.increment('overflow_test', i + 1, 300)
231
- end
232
- wait do
233
- expect(server.commands).to include("increment overflow_test 1 300 1")
234
- expect(server.commands).to include("increment overflow_test 2 300 1")
235
- expect(server.commands).to include("increment overflow_test 3 300 1")
236
- expect(server.commands).to_not include("increment overflow_test 4 300 1")
237
- expect(server.commands).to_not include("increment overflow_test 5 300 1")
231
+ 1.upto(5) do |i|
232
+ agent.increment('overflow_test', i, 300)
238
233
  end
234
+
235
+ wait
236
+ expect(agent.queue.size).to eq(3)
237
+ expect(agent.queue.pop.first).to start_with("increment overflow_test 1 300 1")
238
+ expect(agent.queue.pop.first).to start_with("increment overflow_test 2 300 1")
239
+ expect(agent.queue.pop.first).to start_with("increment overflow_test 3 300 1")
240
+ expect(agent.queue.size).to eq(0)
239
241
  end
240
242
  end
241
243
  end
@@ -479,7 +481,7 @@ shared_examples "Instrumental Agent" do
479
481
  context 'server hangup' do
480
482
  it "should cancel the worker thread when the host has hung up" do
481
483
  # Start the background agent thread and let it send one metric successfully
482
- agent.gauge('connection_failure', 1, 1234)
484
+ agent.gauge('connection_failure1', 1, 1234)
483
485
  wait do
484
486
  expect(server.commands.grep(/connection_failure/).size).to eq(1)
485
487
  end
@@ -487,7 +489,7 @@ shared_examples "Instrumental Agent" do
487
489
  server.stop
488
490
  wait
489
491
  # Send one metric to the stopped server
490
- agent.gauge('connection_failure', 1, 1234)
492
+ agent.gauge('connection_failure2', 1, 1234)
491
493
  # The agent thread should have stopped running since the network write would
492
494
  # have failed. The queue will still contain the metric that has yet to be sent
493
495
  wait do
@@ -524,6 +526,71 @@ shared_examples "Instrumental Agent" do
524
526
  end
525
527
  end
526
528
 
529
+ it "should restart the worker thread after hanging it up during a bad ssl handshake event" do
530
+ # Start the background agent thread and let it send one metric successfully
531
+ agent.gauge('connection_failure', 1, 1234)
532
+ wait do
533
+ expect(server.commands.grep(/connection_failure/).size).to eq(1)
534
+ end
535
+ # Make the agent return the relevant exception on the next connection test
536
+ test_connection_fail = true
537
+ tc = agent.method(:test_connection)
538
+ allow(agent).to receive(:test_connection) do |*args, &block|
539
+ test_connection_fail ? raise(OpenSSL::SSL::SSLError.new) : tc.call(*args)
540
+ end
541
+
542
+ # Send one metric to the agent
543
+ agent.gauge('connection_failure', 1, 1234)
544
+ # The agent thread should have stopped running since the network write would
545
+ # have failed.
546
+ wait do
547
+ expect(agent.send(:running?)).to eq(false)
548
+ end
549
+ # The command is not in the queue
550
+ expect(agent.queue.size).to eq(0)
551
+ # allow the agent to behave normally
552
+ test_connection_fail = false
553
+ # Sending another metric should kickstart the background worker thread
554
+ agent.gauge('connection_failure', 1, 1234)
555
+ # The agent should now be running the background thread, and the queue should be empty
556
+ wait do
557
+ expect(agent.send(:running?)).to eq(true)
558
+ expect(agent.queue.size).to eq(0)
559
+ expect(server.commands.grep(/connection_failure/).size).to eq(2)
560
+ end
561
+ end
562
+
563
+ it "should accurately count failures so that backoff can work as intended" do
564
+ # Start the background agent thread and let it send one metric successfully
565
+ agent.gauge('connection_failure', 1, 1234)
566
+ wait do
567
+ expect(server.commands.grep(/connection_failure/).size).to eq(1)
568
+ end
569
+
570
+ # configure test_connection to fail in a way that won't kill the inner loop
571
+ test_connection_fail = true
572
+ tc = agent.method(:test_connection)
573
+ allow(agent).to receive(:test_connection) do |*args, &block|
574
+ test_connection_fail ? raise("test_connection_fail") : tc.call(*args)
575
+ end
576
+
577
+ # send some metrics
578
+ agent.gauge('connection_failure_1', 1, 1234)
579
+ agent.gauge('connection_failure_2', 1, 1234)
580
+ agent.gauge('connection_failure_3', 1, 1234)
581
+ wait do
582
+ expect(agent.instance_variable_get(:@failures)).to be > 0
583
+ expect(agent.queue.size).to be > 0
584
+ end
585
+
586
+ # let the loop proceed
587
+ test_connection_fail = false
588
+
589
+ wait do
590
+ expect(agent.send(:running?)).to eq(true)
591
+ expect(agent.queue.size).to eq(0)
592
+ end
593
+ end
527
594
  end
528
595
 
529
596
 
metadata CHANGED
@@ -1,100 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: instrumental_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 3.0.0.alpha
5
5
  platform: ruby
6
6
  authors:
7
- - Elijah Miller
8
- - Christopher Zelenak
9
- - Kristopher Chambers
10
- - Matthew Hassfurder
7
+ - Expected Behavior
11
8
  autorequire:
12
9
  bindir: bin
13
10
  cert_chain: []
14
- date: 2018-01-19 00:00:00.000000000 Z
11
+ date: 2019-08-22 00:00:00.000000000 Z
15
12
  dependencies:
16
13
  - !ruby/object:Gem::Dependency
17
14
  name: metrician
18
15
  requirement: !ruby/object:Gem::Requirement
19
16
  requirements:
20
- - - '>='
17
+ - - ">="
21
18
  - !ruby/object:Gem::Version
22
19
  version: '0'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: pry
32
29
  requirement: !ruby/object:Gem::Requirement
33
30
  requirements:
34
- - - '>='
31
+ - - ">="
35
32
  - !ruby/object:Gem::Version
36
33
  version: '0'
37
34
  type: :development
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
- - - '>='
38
+ - - ">="
42
39
  - !ruby/object:Gem::Version
43
40
  version: '0'
44
41
  - !ruby/object:Gem::Dependency
45
42
  name: rake
46
43
  requirement: !ruby/object:Gem::Requirement
47
44
  requirements:
48
- - - '>='
45
+ - - ">="
49
46
  - !ruby/object:Gem::Version
50
47
  version: '0'
51
48
  type: :development
52
49
  prerelease: false
53
50
  version_requirements: !ruby/object:Gem::Requirement
54
51
  requirements:
55
- - - '>='
52
+ - - ">="
56
53
  - !ruby/object:Gem::Version
57
54
  version: '0'
58
55
  - !ruby/object:Gem::Dependency
59
56
  name: rspec
60
57
  requirement: !ruby/object:Gem::Requirement
61
58
  requirements:
62
- - - ~>
59
+ - - "~>"
63
60
  - !ruby/object:Gem::Version
64
61
  version: '3.0'
65
62
  type: :development
66
63
  prerelease: false
67
64
  version_requirements: !ruby/object:Gem::Requirement
68
65
  requirements:
69
- - - ~>
66
+ - - "~>"
70
67
  - !ruby/object:Gem::Version
71
68
  version: '3.0'
72
69
  - !ruby/object:Gem::Dependency
73
70
  name: fuubar
74
71
  requirement: !ruby/object:Gem::Requirement
75
72
  requirements:
76
- - - '>='
73
+ - - ">="
77
74
  - !ruby/object:Gem::Version
78
75
  version: '0'
79
76
  type: :development
80
77
  prerelease: false
81
78
  version_requirements: !ruby/object:Gem::Requirement
82
79
  requirements:
83
- - - '>='
80
+ - - ">="
84
81
  - !ruby/object:Gem::Version
85
82
  version: '0'
86
83
  - !ruby/object:Gem::Dependency
87
84
  name: timecop
88
85
  requirement: !ruby/object:Gem::Requirement
89
86
  requirements:
90
- - - '>='
87
+ - - ">="
91
88
  - !ruby/object:Gem::Version
92
89
  version: '0'
93
90
  type: :development
94
91
  prerelease: false
95
92
  version_requirements: !ruby/object:Gem::Requirement
96
93
  requirements:
97
- - - '>='
94
+ - - ">="
98
95
  - !ruby/object:Gem::Version
99
96
  version: '0'
100
97
  description: This agent supports Instrumental custom metric monitoring for Ruby applications.
@@ -106,19 +103,16 @@ executables: []
106
103
  extensions: []
107
104
  extra_rdoc_files: []
108
105
  files:
109
- - .gitignore
110
- - .rspec
111
- - .ruby-version
112
- - .travis.yml
106
+ - ".gitignore"
107
+ - ".rspec"
108
+ - ".ruby-version"
109
+ - ".travis.yml"
113
110
  - CHANGELOG.md
114
111
  - Gemfile
115
112
  - Guardfile
116
113
  - LICENSE
117
114
  - README.md
118
115
  - Rakefile
119
- - certs/equifax.ca.pem
120
- - certs/geotrust.ca.pem
121
- - certs/rapidssl.ca.pem
122
116
  - instrumental_agent.gemspec
123
117
  - lib/instrumental/agent.rb
124
118
  - lib/instrumental/capistrano.rb
@@ -145,17 +139,16 @@ require_paths:
145
139
  - lib
146
140
  required_ruby_version: !ruby/object:Gem::Requirement
147
141
  requirements:
148
- - - '>='
142
+ - - ">="
149
143
  - !ruby/object:Gem::Version
150
- version: 2.0.0
144
+ version: 2.4.6
151
145
  required_rubygems_version: !ruby/object:Gem::Requirement
152
146
  requirements:
153
- - - '>='
147
+ - - ">"
154
148
  - !ruby/object:Gem::Version
155
- version: '0'
149
+ version: 1.3.1
156
150
  requirements: []
157
- rubyforge_project:
158
- rubygems_version: 2.0.14.1
151
+ rubygems_version: 3.0.3
159
152
  signing_key:
160
153
  specification_version: 4
161
154
  summary: Custom metric monitoring for Ruby applications via Instrumental
@@ -1,69 +0,0 @@
1
- Certificate:
2
- Data:
3
- Version: 3 (0x2)
4
- Serial Number: 903804111 (0x35def4cf)
5
- Signature Algorithm: sha1WithRSAEncryption
6
- Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority
7
- Validity
8
- Not Before: Aug 22 16:41:51 1998 GMT
9
- Not After : Aug 22 16:41:51 2018 GMT
10
- Subject: C=US, O=Equifax, OU=Equifax Secure Certificate Authority
11
- Subject Public Key Info:
12
- Public Key Algorithm: rsaEncryption
13
- RSA Public Key: (1024 bit)
14
- Modulus (1024 bit):
15
- 00:c1:5d:b1:58:67:08:62:ee:a0:9a:2d:1f:08:6d:
16
- 91:14:68:98:0a:1e:fe:da:04:6f:13:84:62:21:c3:
17
- d1:7c:ce:9f:05:e0:b8:01:f0:4e:34:ec:e2:8a:95:
18
- 04:64:ac:f1:6b:53:5f:05:b3:cb:67:80:bf:42:02:
19
- 8e:fe:dd:01:09:ec:e1:00:14:4f:fc:fb:f0:0c:dd:
20
- 43:ba:5b:2b:e1:1f:80:70:99:15:57:93:16:f1:0f:
21
- 97:6a:b7:c2:68:23:1c:cc:4d:59:30:ac:51:1e:3b:
22
- af:2b:d6:ee:63:45:7b:c5:d9:5f:50:d2:e3:50:0f:
23
- 3a:88:e7:bf:14:fd:e0:c7:b9
24
- Exponent: 65537 (0x10001)
25
- X509v3 extensions:
26
- X509v3 CRL Distribution Points:
27
- DirName:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority/CN=CRL1
28
-
29
- X509v3 Private Key Usage Period:
30
- Not After: Aug 22 16:41:51 2018 GMT
31
- X509v3 Key Usage:
32
- Certificate Sign, CRL Sign
33
- X509v3 Authority Key Identifier:
34
- keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4
35
-
36
- X509v3 Subject Key Identifier:
37
- 48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4
38
- X509v3 Basic Constraints:
39
- CA:TRUE
40
- 1.2.840.113533.7.65.0:
41
- 0...V3.0c....
42
- Signature Algorithm: sha1WithRSAEncryption
43
- 58:ce:29:ea:fc:f7:de:b5:ce:02:b9:17:b5:85:d1:b9:e3:e0:
44
- 95:cc:25:31:0d:00:a6:92:6e:7f:b6:92:63:9e:50:95:d1:9a:
45
- 6f:e4:11:de:63:85:6e:98:ee:a8:ff:5a:c8:d3:55:b2:66:71:
46
- 57:de:c0:21:eb:3d:2a:a7:23:49:01:04:86:42:7b:fc:ee:7f:
47
- a2:16:52:b5:67:67:d3:40:db:3b:26:58:b2:28:77:3d:ae:14:
48
- 77:61:d6:fa:2a:66:27:a0:0d:fa:a7:73:5c:ea:70:f1:94:21:
49
- 65:44:5f:fa:fc:ef:29:68:a9:a2:87:79:ef:79:ef:4f:ac:07:
50
- 77:38
51
- -----BEGIN CERTIFICATE-----
52
- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
53
- UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
54
- dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
55
- MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
56
- dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
57
- AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
58
- BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
59
- cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
60
- AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
61
- MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
62
- aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
63
- ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
64
- IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
65
- MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
66
- A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
67
- 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
68
- 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
69
- -----END CERTIFICATE-----
@@ -1,80 +0,0 @@
1
- Certificate:
2
- Data:
3
- Version: 3 (0x2)
4
- Serial Number: 1227750 (0x12bbe6)
5
- Signature Algorithm: sha1WithRSAEncryption
6
- Issuer: C=US, O=Equifax, OU=Equifax Secure Certificate Authority
7
- Validity
8
- Not Before: May 21 04:00:00 2002 GMT
9
- Not After : Aug 21 04:00:00 2018 GMT
10
- Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
11
- Subject Public Key Info:
12
- Public Key Algorithm: rsaEncryption
13
- RSA Public Key: (2048 bit)
14
- Modulus (2048 bit):
15
- 00:da:cc:18:63:30:fd:f4:17:23:1a:56:7e:5b:df:
16
- 3c:6c:38:e4:71:b7:78:91:d4:bc:a1:d8:4c:f8:a8:
17
- 43:b6:03:e9:4d:21:07:08:88:da:58:2f:66:39:29:
18
- bd:05:78:8b:9d:38:e8:05:b7:6a:7e:71:a4:e6:c4:
19
- 60:a6:b0:ef:80:e4:89:28:0f:9e:25:d6:ed:83:f3:
20
- ad:a6:91:c7:98:c9:42:18:35:14:9d:ad:98:46:92:
21
- 2e:4f:ca:f1:87:43:c1:16:95:57:2d:50:ef:89:2d:
22
- 80:7a:57:ad:f2:ee:5f:6b:d2:00:8d:b9:14:f8:14:
23
- 15:35:d9:c0:46:a3:7b:72:c8:91:bf:c9:55:2b:cd:
24
- d0:97:3e:9c:26:64:cc:df:ce:83:19:71:ca:4e:e6:
25
- d4:d5:7b:a9:19:cd:55:de:c8:ec:d2:5e:38:53:e5:
26
- 5c:4f:8c:2d:fe:50:23:36:fc:66:e6:cb:8e:a4:39:
27
- 19:00:b7:95:02:39:91:0b:0e:fe:38:2e:d1:1d:05:
28
- 9a:f6:4d:3e:6f:0f:07:1d:af:2c:1e:8f:60:39:e2:
29
- fa:36:53:13:39:d4:5e:26:2b:db:3d:a8:14:bd:32:
30
- eb:18:03:28:52:04:71:e5:ab:33:3d:e1:38:bb:07:
31
- 36:84:62:9c:79:ea:16:30:f4:5f:c0:2b:e8:71:6b:
32
- e4:f9
33
- Exponent: 65537 (0x10001)
34
- X509v3 extensions:
35
- X509v3 Authority Key Identifier:
36
- keyid:48:E6:68:F9:2B:D2:B2:95:D7:47:D8:23:20:10:4F:33:98:90:9F:D4
37
-
38
- X509v3 Subject Key Identifier:
39
- C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E
40
- X509v3 Basic Constraints: critical
41
- CA:TRUE
42
- X509v3 Key Usage: critical
43
- Certificate Sign, CRL Sign
44
- X509v3 CRL Distribution Points:
45
- URI:http://crl.geotrust.com/crls/secureca.crl
46
-
47
- X509v3 Certificate Policies:
48
- Policy: X509v3 Any Policy
49
- CPS: https://www.geotrust.com/resources/repository
50
-
51
- Signature Algorithm: sha1WithRSAEncryption
52
- 76:e1:12:6e:4e:4b:16:12:86:30:06:b2:81:08:cf:f0:08:c7:
53
- c7:71:7e:66:ee:c2:ed:d4:3b:1f:ff:f0:f0:c8:4e:d6:43:38:
54
- b0:b9:30:7d:18:d0:55:83:a2:6a:cb:36:11:9c:e8:48:66:a3:
55
- 6d:7f:b8:13:d4:47:fe:8b:5a:5c:73:fc:ae:d9:1b:32:19:38:
56
- ab:97:34:14:aa:96:d2:eb:a3:1c:14:08:49:b6:bb:e5:91:ef:
57
- 83:36:eb:1d:56:6f:ca:da:bc:73:63:90:e4:7f:7b:3e:22:cb:
58
- 3d:07:ed:5f:38:74:9c:e3:03:50:4e:a1:af:98:ee:61:f2:84:
59
- 3f:12
60
- -----BEGIN CERTIFICATE-----
61
- MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
62
- MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
63
- aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
64
- WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
65
- AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
66
- CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
67
- OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
68
- T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
69
- JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
70
- Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
71
- PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
72
- aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
73
- TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
74
- LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
75
- BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
76
- dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
77
- AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
78
- NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
79
- b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
80
- -----END CERTIFICATE-----
@@ -1,94 +0,0 @@
1
- Certificate:
2
- Data:
3
- Version: 3 (0x2)
4
- Serial Number: 146039 (0x23a77)
5
- Signature Algorithm: sha256WithRSAEncryption
6
- Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
7
- Validity
8
- Not Before: Aug 29 21:39:32 2014 GMT
9
- Not After : May 20 21:39:32 2022 GMT
10
- Subject: C=US, O=GeoTrust Inc., CN=RapidSSL SHA256 CA - G3
11
- Subject Public Key Info:
12
- Public Key Algorithm: rsaEncryption
13
- RSA Public Key: (2048 bit)
14
- Modulus (2048 bit):
15
- 00:af:54:9b:d9:58:5d:1e:2c:56:c6:d5:e8:7f:f4:
16
- 7d:16:03:ff:d0:8b:5a:e4:8e:a7:dd:54:2e:d4:04:
17
- c0:5d:98:9c:8d:90:0f:bc:10:65:5f:da:9a:d6:44:
18
- 7c:c0:9f:b5:e9:4a:8c:0b:06:43:04:bb:f4:96:e2:
19
- 26:f6:61:01:91:66:31:22:c3:34:34:5f:3f:3f:91:
20
- 2f:44:5f:dc:c7:14:b6:03:9f:86:4b:0e:a3:ff:a0:
21
- 80:02:83:c3:d3:1f:69:52:d6:9d:64:0f:c9:83:e7:
22
- 1b:c4:70:ac:94:e7:c3:a4:6a:2c:bd:b8:9e:69:d8:
23
- be:0a:8f:16:63:5a:68:71:80:7b:30:de:15:04:bf:
24
- cc:d3:bf:3e:48:05:55:7a:b3:d7:10:0c:03:fc:9b:
25
- fd:08:a7:8c:8c:db:a7:8e:f1:1e:63:dc:b3:01:2f:
26
- 7f:af:57:c3:3c:48:a7:83:68:21:a7:2f:e7:a7:3f:
27
- f0:b5:0c:fc:f5:84:d1:53:bc:0e:72:4f:60:0c:42:
28
- b8:98:ad:19:88:57:d7:04:ec:87:bf:7e:87:4e:a3:
29
- 21:f9:53:fd:36:98:48:8d:d6:f8:bb:48:f2:29:c8:
30
- 64:d1:cc:54:48:53:8b:af:b7:65:1e:bf:29:33:29:
31
- d9:29:60:48:f8:ff:91:bc:57:58:e5:35:2e:bb:69:
32
- b6:59
33
- Exponent: 65537 (0x10001)
34
- X509v3 extensions:
35
- X509v3 Authority Key Identifier:
36
- keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E
37
-
38
- X509v3 Subject Key Identifier:
39
- C3:9C:F3:FC:D3:46:08:34:BB:CE:46:7F:A0:7C:5B:F3:E2:08:CB:59
40
- X509v3 Basic Constraints: critical
41
- CA:TRUE, pathlen:0
42
- X509v3 Key Usage: critical
43
- Certificate Sign, CRL Sign
44
- X509v3 CRL Distribution Points:
45
- URI:http://g.symcb.com/crls/gtglobal.crl
46
-
47
- Authority Information Access:
48
- OCSP - URI:http://g.symcd.com
49
-
50
- X509v3 Certificate Policies:
51
- Policy: 2.16.840.1.113733.1.7.54
52
- CPS: http://www.geotrust.com/resources/cps
53
-
54
- Signature Algorithm: sha256WithRSAEncryption
55
- a3:58:1e:c6:43:32:ac:ac:2f:93:78:b7:ea:ae:54:40:47:2d:
56
- 7e:78:8d:50:f6:f8:66:ac:d6:4f:73:d6:44:ef:af:0b:cc:5b:
57
- c1:f4:4f:9a:8f:49:7e:60:af:c2:27:c7:16:f1:fb:93:81:90:
58
- a9:7c:ef:6f:7e:6e:45:94:16:84:bd:ec:49:f1:c4:0e:f4:af:
59
- 04:59:83:87:0f:2c:3b:97:c3:5a:12:9b:7b:04:35:7b:a3:95:
60
- 33:08:7b:93:71:22:42:b3:a9:d9:6f:4f:81:92:fc:07:b6:79:
61
- bc:84:4a:9d:77:09:f1:c5:89:f2:f0:b4:9c:54:aa:12:7b:0d:
62
- ba:4f:ef:93:19:ec:ef:7d:4e:61:a3:8e:76:9c:59:cf:8c:94:
63
- b1:84:97:f7:1a:b9:07:b8:b2:c6:4f:13:79:db:bf:4f:51:1b:
64
- 7f:69:0d:51:2a:c1:d6:15:ff:37:51:34:65:51:f4:1e:be:38:
65
- 6a:ec:0e:ab:bf:3d:7b:39:05:7b:f4:f3:fb:1a:a1:d0:c8:7e:
66
- 4e:64:8d:cd:8c:61:55:90:fe:3a:ca:5d:25:0f:f8:1d:a3:4a:
67
- 74:56:4f:1a:55:40:70:75:25:a6:33:2e:ba:4b:a5:5d:53:9a:
68
- 0d:30:e1:8d:5f:61:2c:af:cc:ef:b0:99:a1:80:ff:0b:f2:62:
69
- 4c:70:26:98
70
- -----BEGIN CERTIFICATE-----
71
- MIIEJTCCAw2gAwIBAgIDAjp3MA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
72
- MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
73
- YWwgQ0EwHhcNMTQwODI5MjEzOTMyWhcNMjIwNTIwMjEzOTMyWjBHMQswCQYDVQQG
74
- EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXUmFwaWRTU0wg
75
- U0hBMjU2IENBIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCv
76
- VJvZWF0eLFbG1eh/9H0WA//Qi1rkjqfdVC7UBMBdmJyNkA+8EGVf2prWRHzAn7Xp
77
- SowLBkMEu/SW4ib2YQGRZjEiwzQ0Xz8/kS9EX9zHFLYDn4ZLDqP/oIACg8PTH2lS
78
- 1p1kD8mD5xvEcKyU58Okaiy9uJ5p2L4KjxZjWmhxgHsw3hUEv8zTvz5IBVV6s9cQ
79
- DAP8m/0Ip4yM26eO8R5j3LMBL3+vV8M8SKeDaCGnL+enP/C1DPz1hNFTvA5yT2AM
80
- QriYrRmIV9cE7Ie/fodOoyH5U/02mEiN1vi7SPIpyGTRzFRIU4uvt2UevykzKdkp
81
- YEj4/5G8V1jlNS67abZZAgMBAAGjggEdMIIBGTAfBgNVHSMEGDAWgBTAephojYn7
82
- qwVkDBF9qn1luMrMTjAdBgNVHQ4EFgQUw5zz/NNGCDS7zkZ/oHxb8+IIy1kwEgYD
83
- VR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAQYwNQYDVR0fBC4wLDAqoCig
84
- JoYkaHR0cDovL2cuc3ltY2IuY29tL2NybHMvZ3RnbG9iYWwuY3JsMC4GCCsGAQUF
85
- BwEBBCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL2cuc3ltY2QuY29tMEwGA1UdIARF
86
- MEMwQQYKYIZIAYb4RQEHNjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdlb3Ry
87
- dXN0LmNvbS9yZXNvdXJjZXMvY3BzMA0GCSqGSIb3DQEBCwUAA4IBAQCjWB7GQzKs
88
- rC+TeLfqrlRARy1+eI1Q9vhmrNZPc9ZE768LzFvB9E+aj0l+YK/CJ8cW8fuTgZCp
89
- fO9vfm5FlBaEvexJ8cQO9K8EWYOHDyw7l8NaEpt7BDV7o5UzCHuTcSJCs6nZb0+B
90
- kvwHtnm8hEqddwnxxYny8LScVKoSew26T++TGezvfU5ho452nFnPjJSxhJf3GrkH
91
- uLLGTxN5279PURt/aQ1RKsHWFf83UTRlUfQevjhq7A6rvz17OQV79PP7GqHQyH5O
92
- ZI3NjGFVkP46yl0lD/gdo0p0Vk8aVUBwdSWmMy66S6VdU5oNMOGNX2Esr8zvsJmh
93
- gP8L8mJMcCaY
94
- -----END CERTIFICATE-----