r509-cert-validator 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f1727921e4d1ea7764cfd809a42478d3ec8cb4cf
4
+ data.tar.gz: ecca2f905cfe41c45a7130d3eeb095fecff9693a
5
+ SHA512:
6
+ metadata.gz: 711bb8c8d34ffbbefcd0859f512cee2056696f2d047ff8c60ed6d629186122c0986501914db7397d726e997da1ec5bf26e3d4469e277750fd80962102298e4db
7
+ data.tar.gz: 5f4d58440734468761e8f8eb9363246f3cb12a05de8dd0aa27ab0e33fe15d933d38f62c3f37efc0e08b270f9e174907c089676b582ca4fea58ba1ef3d358c483
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ cache: bundler
3
+ script: ./travis.sh
4
+ rvm:
5
+ - 2.0.0
6
+ - 2.1.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in r509-cert-validator.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Bryce Kerley
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,70 @@
1
+ # R509::Cert::Validator
2
+
3
+ Have an x.509 certificate that you need to validate against its Online
4
+ Certificate Status Protocol (OCSP) or Certificate Revocation List (CRL)
5
+ endpoint? This gem uses the `r509` library for x.509 processing, and performs
6
+ OCSP and CRL processing.
7
+
8
+ [![Build Status](https://travis-ci.org/bkerley/r509-cert-validator.png?branch=master)](https://travis-ci.org/bkerley/r509-cert-validator)
9
+ [![Code Climate](https://codeclimate.com/github/bkerley/r509-cert-validator.png)](https://codeclimate.com/github/bkerley/r509-cert-validator)
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'r509-cert-validator'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install r509-cert-validator
24
+
25
+ ## Usage
26
+
27
+ ```ruby
28
+ validator = R509::Cert::Validator.new @socket.peer_cert
29
+
30
+ # Returns false on invalid certificates
31
+ # Raises R509::Cert::Validator::Error when checking failed
32
+ validator.validate
33
+
34
+ # Raises R509::Cert::Validator::CrlError and
35
+ # R509::Cert::Validator::OcspError on invalid certificates
36
+ # Raises R509::Cert::Validator::Error when checking failed
37
+ validator.validate!
38
+
39
+ # OCSP and CRL checking are enabled when present in certificates, but
40
+ # can be disabled individually
41
+ validator.validate ocsp: false
42
+ validator.validate! crl: false
43
+
44
+ # Attempting to validate OCSP and/or CRL when a cert does not have them raises
45
+ # R509::Cert::Validator::Error
46
+ validator.validate ocsp: true
47
+ ```
48
+
49
+ ## Development and Testing
50
+
51
+ This library requires a bit of Public Key Infrastructure (PKI) for testing.
52
+ Fortunately, it's easy to set up.
53
+
54
+ 0. Install dependencies with `bundle install`.
55
+ 0. Optional: clean out the existing PKI with `rake ca:clean`
56
+ 1. Generate a CA and testing certificates with `rake ca:all`
57
+ 2. Start the CRL and OCSP endpoint with `bundle exec ruby spec/support/ca_server.rb`
58
+ and let it run. This command starts a web server on port 22022.
59
+ 3. Run the specs with `bundle exec rspec`
60
+ 4. CTRL-C or otherwise kill the CRL and OCSP server when you no longer need it.
61
+
62
+ This process is automated by `travis.sh`, and you can just run that :)
63
+
64
+ ## Contributing
65
+
66
+ 1. Fork it
67
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
68
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
69
+ 4. Push to the branch (`git push origin my-new-feature`)
70
+ 5. Create new Pull Request
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+ require_relative './lib/tasks/ca'
4
+
5
+ task :default => :spec
6
+
7
+ desc "Run Specs"
8
+ RSpec::Core::RakeTask.new :spec
@@ -0,0 +1 @@
1
+ require 'r509/cert/validator'
@@ -0,0 +1,62 @@
1
+ require 'r509'
2
+ %w{version errors basic_validator ocsp_validator crl_validator}.each do |f|
3
+ require "r509/cert/validator/#{f}"
4
+ end
5
+
6
+ module R509
7
+ class Cert
8
+ class Validator
9
+ # The certificate this Validator will validate
10
+ attr_reader :cert
11
+
12
+ def initialize(cert, issuer = nil)
13
+ if cert.is_a? OpenSSL::X509::Certificate
14
+ cert = R509::Cert.new cert: cert
15
+ end
16
+
17
+ if issuer.is_a? OpenSSL::X509::Certificate
18
+ cert = R509::Cert.new cert: cert
19
+ end
20
+
21
+ @cert = cert
22
+ @issuer = issuer
23
+
24
+ initialize_validators
25
+ end
26
+
27
+ def validate!(options={})
28
+ opts = { ocsp: @ocsp.available?, crl: @crl.available? }.merge options
29
+
30
+ if opts[:ocsp] && !@ocsp.available?
31
+ raise Error.new "Tried to validate OCSP but cert has no OCSP data"
32
+ end
33
+
34
+ if opts[:crl] && !@crl.available?
35
+
36
+ end
37
+
38
+ @ocsp.validate! if opts[:ocsp]
39
+ @crl.validate! if opts[:crl]
40
+ true
41
+ end
42
+
43
+ def validate(options={})
44
+ begin
45
+ validate! options
46
+ rescue OcspError
47
+ return false
48
+ rescue CrlError
49
+ return false
50
+ end
51
+
52
+ return true
53
+ end
54
+
55
+ private
56
+ def initialize_validators
57
+ @ocsp = OcspValidator.new @cert, @issuer
58
+ @crl = CrlValidator.new @cert, @issuer
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,24 @@
1
+ require 'net/http'
2
+
3
+ module R509
4
+ class Cert
5
+ class Validator
6
+ class BasicValidator
7
+ def initialize(cert, issuer)
8
+ @cert = cert
9
+ @issuer = issuer
10
+ end
11
+
12
+ private
13
+ def get(uri)
14
+ resp = Net::HTTP.get_response URI(uri)
15
+ if resp.code != '200'
16
+ raise Error.new("Unexpected HTTP #{resp.code} from OCSP endpoint")
17
+ end
18
+
19
+ resp.body
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ module R509
2
+ class Cert
3
+ class Validator
4
+ class CrlValidator < BasicValidator
5
+ def available?
6
+ return false unless cdp
7
+ return false if uris.empty?
8
+ return true
9
+ end
10
+
11
+ def validate!
12
+ unless available?
13
+ raise Error.new "Tried to validate CRL but cert has no CRL data"
14
+ end
15
+
16
+ body = R509::CRL::SignedList.new(get(uris.first))
17
+
18
+ unless body.verify @issuer.public_key
19
+ raise CrlError.new "CRL did not match certificate"
20
+ end
21
+
22
+ if body.revoked? @cert.serial
23
+ raise CrlError.new "CRL listed certificate as revoked"
24
+ end
25
+
26
+ return true
27
+ end
28
+
29
+ private
30
+ def cdp
31
+ @cert.crl_distribution_points
32
+ end
33
+
34
+ def uris
35
+ cdp.uris
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,14 @@
1
+ module R509
2
+ class Cert
3
+ class Validator
4
+ class Error < ::StandardError
5
+ end
6
+
7
+ class OcspError < Error
8
+ end
9
+
10
+ class CrlError < Error
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,87 @@
1
+ require 'base64'
2
+
3
+ module R509
4
+ class Cert
5
+ class Validator
6
+ class OcspValidator < BasicValidator
7
+ def available?
8
+ return false unless @issuer
9
+ return false unless aia && aia.ocsp
10
+ return false if ocsp_uris.empty?
11
+ return true
12
+ end
13
+
14
+ def validate!
15
+ unless available?
16
+ raise Error.new "Tried to validate OCSP but cert has no OCSP data"
17
+ end
18
+
19
+ uri = build_request_uri
20
+ body = R509::OCSP::Response.parse(get(uri))
21
+
22
+ check_ocsp_response body
23
+ check_ocsp_payload body.basic.status.first
24
+ return true
25
+ end
26
+
27
+ private
28
+ def build_request_uri
29
+ @req = OpenSSL::OCSP::Request.new
30
+ @req.add_nonce
31
+ @req.add_certid cert_id
32
+ pem = Base64.encode64(@req.to_der).strip
33
+ URI(ocsp_uris.first + '/' + URI.encode_www_form_component(pem))
34
+ end
35
+
36
+ def check_ocsp_response(body)
37
+ unless body.status == 0
38
+ raise OcspError.new "OCSP status was #{body.status}, expected 0"
39
+ end
40
+
41
+ unless body.verify(@issuer.cert)
42
+ raise OcspError.new "OCSP response did not match issuer"
43
+ end
44
+
45
+ unless body.basic.status.first
46
+ raise OcspError.new "OCSP response was missing payload"
47
+ end
48
+
49
+ if body.check_nonce(@req) != R509::OCSP::Request::Nonce::PRESENT_AND_EQUAL
50
+ raise OcspError.new "OCSP Nonce was not present and equal to request"
51
+ end
52
+ end
53
+
54
+ def check_ocsp_payload(basic)
55
+ if basic[0].serial != @cert.serial
56
+ raise OcspError.new "OCSP cert serial was #{basic[0].serial}, expected #{@cert.serial}"
57
+ end
58
+
59
+ if basic[1] == 1
60
+ raise OcspError.new "OCSP response indicates cert was revoked"
61
+ end
62
+
63
+ if basic[1] != 0
64
+ raise OcspError.new "OCSP response was #{basic[1]}, expected 0"
65
+ end
66
+
67
+ validity_range = (basic[4]..basic[5])
68
+ unless validity_range.cover? Time.now
69
+ raise OcspError.new "OCSP response outside validity window"
70
+ end
71
+ end
72
+
73
+ def aia
74
+ @aia ||= @cert.authority_info_access
75
+ end
76
+
77
+ def ocsp_uris
78
+ aia.ocsp.uris
79
+ end
80
+
81
+ def cert_id
82
+ @cert_id ||= OpenSSL::OCSP::CertificateId.new @cert.cert, @issuer.cert
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,7 @@
1
+ module R509
2
+ class Cert
3
+ class Validator
4
+ VERSION = "0.0.1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,112 @@
1
+ require 'r509'
2
+ require 'erb'
3
+ require_relative 'helper'
4
+
5
+ namespace :ca do
6
+ desc 'Generate all the certificates for testing'
7
+ task :all => %i{ good ocsp_only crl_only empty revoked }
8
+
9
+ task :clean do
10
+ Dir.chdir 'spec/support/ca' do
11
+ sh 'rm -f *.crt *.crl *.key *.txt *.yaml'
12
+ end
13
+ end
14
+
15
+ desc 'Generate a signing CA for testing certificates'
16
+ task :root => 'spec/support/ca/root.key'
17
+ file 'spec/support/ca/root.key' do |t|
18
+ subject = OpenSSL::X509::Name.new
19
+ 'C=US/ST=Florida/L=Miami/O=r509-cert-validator/CN='.split('/').each do |s|
20
+ key, value = s.split '=', 2
21
+ subject.add_entry key, value
22
+ end
23
+ csr = CaHelper.csr
24
+ cert = R509::CertificateAuthority::Signer.selfsign(
25
+ csr: csr,
26
+ not_after: (Time.now.to_i + (86400 * 3650)),
27
+ message_digest: 'sha1'
28
+ )
29
+
30
+ csr.key.write_pem 'spec/support/ca/root.key'
31
+ cert.write_pem 'spec/support/ca/root.crt'
32
+
33
+ sh "touch spec/support/ca/rcv_spec_list.txt"
34
+ sh "touch spec/support/ca/rcv_spec_crlnumber.txt"
35
+ end
36
+ file 'spec/support/ca/root.crt' => 'spec/support/ca/root.key'
37
+ file 'spec/support/ca/rcv_spec_list.txt' => 'spec/support/ca/root.key'
38
+ file 'spec/support/ca/rcv_spec_crlnumber.txt' => 'spec/support/ca/root.key
39
+ '
40
+
41
+ file 'spec/support/ca/config.yaml' => 'spec/support/ca/config.yaml.erb' do |s|
42
+ erb = ERB.new File.read s.prerequisites.first
43
+ b = binding
44
+ cert_path = File.expand_path 'spec/support/ca/'
45
+ File.open s.name, 'w' do |f|
46
+ f.write erb.result b
47
+ end
48
+ end
49
+
50
+ desc 'Generate a valid certificate with CRL and OCSP data'
51
+ task :good => 'spec/support/ca/good.crt'
52
+ file 'spec/support/ca/good.crt' => [:root, 'spec/support/ca/config.yaml'] do
53
+ ca = CaHelper.ca
54
+ csr = CaHelper.options_builder.build_and_enforce(
55
+ csr: CaHelper.csr,
56
+ profile_name: 'good'
57
+ )
58
+
59
+ cert = ca.sign csr
60
+ cert.write_pem 'spec/support/ca/good.crt'
61
+ end
62
+
63
+ desc 'Generate a valid certificate with only CRL data'
64
+ task :crl_only => 'spec/support/ca/crl_only.crt'
65
+ file 'spec/support/ca/crl_only.crt' => [:root, 'spec/support/ca/config.yaml'] do |t|
66
+ ca = CaHelper.ca
67
+ csr = CaHelper.options_builder.build_and_enforce(
68
+ csr: CaHelper.csr,
69
+ profile_name: 'crl_only'
70
+ )
71
+ cert = ca.sign csr
72
+ cert.write_pem 'spec/support/ca/crl_only.crt'
73
+ end
74
+
75
+ desc 'Generate a valid certificate with only OCSP data'
76
+ task :ocsp_only => 'spec/support/ca/ocsp_only.crt'
77
+ file 'spec/support/ca/ocsp_only.crt' => [:root, 'spec/support/ca/config.yaml'] do |t|
78
+ ca = CaHelper.ca
79
+ csr = CaHelper.options_builder.build_and_enforce(
80
+ csr: CaHelper.csr,
81
+ profile_name: 'ocsp_only'
82
+ )
83
+ cert = ca.sign csr
84
+ cert.write_pem 'spec/support/ca/ocsp_only.crt'
85
+ end
86
+
87
+ desc 'Generate a certificate and revoke it in both CRL and OCSP'
88
+ task :revoked => 'spec/support/ca/revoked.crt'
89
+ file 'spec/support/ca/revoked.crt' => [:root, 'spec/support/ca/config.yaml'] do |t|
90
+ ca = CaHelper.ca
91
+ csr = CaHelper.options_builder.build_and_enforce(
92
+ csr: CaHelper.csr,
93
+ profile_name: 'good'
94
+ )
95
+
96
+ cert = ca.sign csr
97
+ cert.write_pem 'spec/support/ca/revoked.crt'
98
+
99
+ admin = R509::CRL::Administrator.new CaHelper.pool['rcv_spec_ca']
100
+ admin.revoke_cert cert.serial
101
+ crl = admin.generate_crl
102
+ crl.write_pem 'spec/support/ca/rcv_spec.crl'
103
+ end
104
+
105
+ desc 'Generate a valid certificate with no CRL or OCSP data'
106
+ task :empty => 'spec/support/ca/empty.crt'
107
+ file 'spec/support/ca/empty.crt' => [:root, 'spec/support/ca/config.yaml'] do
108
+ ca = CaHelper.ca
109
+ cert = ca.sign csr: CaHelper.csr
110
+ cert.write_pem 'spec/support/ca/empty.crt'
111
+ end
112
+ end
@@ -0,0 +1,33 @@
1
+ require 'r509'
2
+
3
+ module CaHelper
4
+ def self.csr
5
+ R509::CSR.new(
6
+ subject: {
7
+ C: 'US',
8
+ ST: 'Florida',
9
+ L: 'Miami',
10
+ O: 'r509-cert-validator',
11
+ CN: 'localhost'
12
+ },
13
+ bit_length: 512,
14
+ type: 'RSA',
15
+ message_digest: 'sha1'
16
+ )
17
+ end
18
+
19
+ def self.ca
20
+ @ca ||= R509::CertificateAuthority::Signer.new pool['rcv_spec_ca']
21
+ end
22
+
23
+ def self.options_builder
24
+ @builder ||= R509::CertificateAuthority::OptionsBuilder.new pool['rcv_spec_ca']
25
+ end
26
+
27
+ def self.pool
28
+ @pool ||= R509::Config::CAConfigPool.from_yaml(
29
+ 'certificate_authorities',
30
+ File.read('spec/support/ca/config.yaml')
31
+ )
32
+ end
33
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'r509/cert/validator/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "r509-cert-validator"
8
+ spec.version = R509::Cert::Validator::VERSION
9
+ spec.authors = ["Bryce Kerley"]
10
+ spec.email = ["bkerley@brycekerley.net"]
11
+ spec.description = %q{Tool for validating x509 certificates against CRLs and OCSP.}
12
+ spec.summary = %q{An r509-based tool for validating x509 certificates against CRLs and OCSP.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.required_ruby_version = '~> 2.0'
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake", "~> 10.1.1"
25
+ spec.add_development_dependency "rspec", "~> 2.14.1"
26
+ spec.add_development_dependency 'rack', '~> 1.5.2'
27
+ spec.add_development_dependency 'puma', '~> 2.7.1'
28
+ spec.add_development_dependency 'r509-ocsp-responder', '~> 0.3.3'
29
+ spec.add_development_dependency 'r509-validity-crl', '~> 0.1.1'
30
+ spec.add_runtime_dependency "r509", "~> 0.10.0"
31
+ end
@@ -0,0 +1,11 @@
1
+ require 'r509/cert/validator'
2
+
3
+ def load_cert(name)
4
+ path = File.join(File.dirname(__FILE__), 'support', 'ca', name)
5
+ data = File.read path
6
+ return OpenSSL::X509::Certificate.new data
7
+ end
8
+
9
+ def cert(name)
10
+ R509::Cert.new cert: load_cert(name)
11
+ end
@@ -0,0 +1,5 @@
1
+ config.yaml
2
+ *.crt
3
+ *.crl
4
+ *.txt
5
+ *.key
@@ -0,0 +1,35 @@
1
+ ---
2
+ copy_nonce: true
3
+ certificate_authorities:
4
+ rcv_spec_ca:
5
+ ca_cert:
6
+ cert: <%= cert_path %>/root.crt
7
+ key: <%= cert_path %>/root.key
8
+ ocsp_start_skew_seconds: 3600
9
+ ocsp_validity_hours: 168
10
+ crl_list_file: <%= cert_path %>/rcv_spec_list.txt
11
+ crl_number_file: <%= cert_path %>/rcv_spec_crlnumber.txt
12
+ crl_validity_hours: 87600
13
+ crl_md: SHA1
14
+ profiles:
15
+ good:
16
+ authority_info_access:
17
+ :ocsp_location:
18
+ - :type: URI
19
+ :value: http://localhost:22022/ocsp
20
+ crl_distribution_points:
21
+ :value:
22
+ - :type: URI
23
+ :value: http://localhost:22022/crl
24
+ crl_only:
25
+ crl_distribution_points:
26
+ :value:
27
+ - :type: URI
28
+ :value: http://localhost:22022/crl
29
+ ocsp_only:
30
+ authority_info_access:
31
+ :ocsp_location:
32
+ - :type: URI
33
+ :value: http://localhost:22022/ocsp
34
+ certwriter:
35
+ path: <%= cert_path %>
@@ -0,0 +1,29 @@
1
+ require 'r509/ocsp/responder/server'
2
+ require 'r509/validity/crl'
3
+ require 'dependo'
4
+ require 'logger'
5
+ require 'rack'
6
+
7
+ crl_paths = [File.join(File.dirname(__FILE__), 'ca/rcv_spec.crl')]
8
+
9
+ reload_interval = '5s' #yolo
10
+ Dependo::Registry[:validity_checker] = R509::Validity::CRL::Checker.new(
11
+ crl_paths,
12
+ reload_interval
13
+ )
14
+ Dependo::Registry[:log] = Logger.new STDERR
15
+
16
+ Dir.chdir File.join(File.dirname(__FILE__), 'ca') do
17
+ R509::OCSP::Responder::OCSPConfig.load_config
18
+ end
19
+ R509::OCSP::Responder::OCSPConfig.print_config
20
+
21
+ responder = R509::OCSP::Responder::Server
22
+
23
+ Rack::Server.start(
24
+ app: Rack::URLMap.new(
25
+ '/ocsp' => R509::OCSP::Responder::Server,
26
+ '/crl' => Rack::File.new(File.join(File.dirname(__FILE__), 'ca', 'rcv_spec.crl'))
27
+ ),
28
+ Port: 22022
29
+ )
@@ -0,0 +1,15 @@
1
+ **DO NOT USE THESE IN PRODUCTION**
2
+
3
+ This directory has certificates and a key for testing Riak authentication.
4
+
5
+ * no_validator.crt - a certificate with no CRL or OCSP data
6
+ * ca.crt - a certificate for the CA that issued no_validator.crt
7
+ * github_chain.crt - the complete set of certificates presented by
8
+ https://github.com at 6:48 PM US Eastern time on Feb. 6, 2014. This
9
+ certificate has CRL and OCSP endpoints.
10
+ * github.crt - the GitHub certificate from above
11
+ * digicert_ev.crt - the Digicert EV CA that issued github.crt
12
+
13
+ **DO NOT USE THESE IN PRODUCTION**
14
+
15
+ These were generated using https://github.com/basho-labs/riak-ruby-ca .
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDjDCCAnQCCQDrkNSIB3EtsDANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC
3
+ VVMxEDAOBgNVBAgMB0Zsb3JpZGExDjAMBgNVBAcMBU1pYW1pMQ4wDAYDVQQKDAVC
4
+ YXNobzEZMBcGA1UECwwQUmlhayBSdWJ5IENsaWVudDELMAkGA1UEAwwCQ0ExHjAc
5
+ BgkqhkiG9w0BCQEWD2JyeWNlQGJhc2hvLmNvbTAeFw0xNDAyMDUxNjI5MDBaFw0x
6
+ MzA4MDUxNjI5MDBaMIGHMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHRmxvcmlkYTEO
7
+ MAwGA1UEBwwFTWlhbWkxDjAMBgNVBAoMBUJhc2hvMRkwFwYDVQQLDBBSaWFrIFJ1
8
+ YnkgQ2xpZW50MQswCQYDVQQDDAJDQTEeMBwGCSqGSIb3DQEJARYPYnJ5Y2VAYmFz
9
+ aG8uY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0OuLzsUEbF53
10
+ BGhI1uLbwAK+DoWWQL0kPB0cCFYXkfR0Y/wCeq0iDgwq0+CR2otmcMR8Sg13h8dm
11
+ YfKWnKeVh1uvWDasE9t1BXvi0b8gunwMvSz2DKwyxYqjI8+PGmL6tg2lcmlC/eHA
12
+ Y6ObowXycMW5mugcp524yeWpsJ+YBnDPwctKtMJExPAl4mZp9Y5kffeROBrWwkeg
13
+ 1nbB1GJCPw9t2/4kMl7ksa7/b6dKbq/ra/zcfB0b0BC8dkoTKgcSaGVycFguIn1R
14
+ Xn0i3ruwN644ODt/H/3qQp1Qyh/jrz/aRMjuk/3jpwwzo5buoUYgk8FVGnG4x+FE
15
+ S+trFWOs7QIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQBFxRahSTOmyYtqbcrDG7S5
16
+ eLghOpUr1jXU3dfVOf+/1u9g/HZCXYGPr+tRw+OsxiR5Cw6U8Nj2gQdZmsCkVMRp
17
+ 3XUE2Wo5O+ogaV4l68ODZ+uS1yxjvRqoOC0M1/XtihCvNJtpLiaRMxysARp4wnH2
18
+ ReksBUMxwDl2tEYcczTXRiKRk2QL6BeQ+l08O9scbSjClso8Wfq+z5Z+qSuFwjC9
19
+ LpxR6aEc6HVnKgio/Pi+6MJwP7NafBXVfTUK9RoFnG8F/fPAbAPqxXK1qYoTHzHr
20
+ d44rhxSOHHNDq3074VlBbMtx+NvCoIk3k5/5Am1rmezxGtA9ESofEgSo1/H9oQYH
21
+ -----END CERTIFICATE-----
@@ -0,0 +1,39 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIG5jCCBc6gAwIBAgIQAze5KDR8YKauxa2xIX84YDANBgkqhkiG9w0BAQUFADBs
3
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
4
+ d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
5
+ ZSBFViBSb290IENBMB4XDTA3MTEwOTEyMDAwMFoXDTIxMTExMDAwMDAwMFowaTEL
6
+ MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
7
+ LmRpZ2ljZXJ0LmNvbTEoMCYGA1UEAxMfRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
8
+ RVYgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPOWYth1bhn/
9
+ PzR8SU8xfg0ETpmB4rOFVZEwscCvcLssqOcYqj9495BoUoYBiJfiOwZlkKq9ZXbC
10
+ 7L4QWzd4g2B1Rca9dKq2n6Q6AVAXxDlpufFP74LByvNK28yeUE9NQKM6kOeGZrzw
11
+ PnYoTNF1gJ5qNRQ1A57bDIzCKK1Qss72kaPDpQpYSfZ1RGy6+c7pqzoC4E3zrOJ6
12
+ 4GAiBTyC01Li85xH+DvYskuTVkq/cKs+6WjIHY9YHSpNXic9rQpZL1oRIEDZaARo
13
+ LfTAhAsKG3jf7RpY3PtBWm1r8u0c7lwytlzs16YDMqbo3rcoJ1mIgP97rYlY1R4U
14
+ pPKwcNSgPqcCAwEAAaOCA4UwggOBMA4GA1UdDwEB/wQEAwIBhjA7BgNVHSUENDAy
15
+ BggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUH
16
+ AwgwggHEBgNVHSAEggG7MIIBtzCCAbMGCWCGSAGG/WwCATCCAaQwOgYIKwYBBQUH
17
+ AgEWLmh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5o
18
+ dG0wggFkBggrBgEFBQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0
19
+ AGgAaQBzACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1
20
+ AHQAZQBzACAAYQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABp
21
+ AGcAaQBDAGUAcgB0ACAARQBWACAAQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBl
22
+ AGwAeQBpAG4AZwAgAFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBo
23
+ AGkAYwBoACAAbABpAG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAg
24
+ AGEAcgBlACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAg
25
+ AGIAeQAgAHIAZQBmAGUAcgBlAG4AYwBlAC4wEgYDVR0TAQH/BAgwBgEB/wIBADCB
26
+ gwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
27
+ dC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NBQ2Vy
28
+ dHMvRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3J0MIGPBgNVHR8EgYcw
29
+ gYQwQKA+oDyGOmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hB
30
+ c3N1cmFuY2VFVlJvb3RDQS5jcmwwQKA+oDyGOmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0
31
+ LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5jcmwwHQYDVR0OBBYE
32
+ FExYyyXwQU9S9CjIgUObpqig5pLlMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSYJhoI
33
+ Au9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQBMeheHKF0XvLIyc7/NLvVYMR3wsXFU
34
+ nNabZ5PbLwM+Fm8eA8lThKNWYB54lBuiqG+jpItSkdfdXJW777UWSemlQk808kf/
35
+ roF/E1S3IMRwFcuBCoHLdFfcnN8kpCkMGPAc5K4HM+zxST5Vz25PDVR708noFUjU
36
+ xbvcNRx3RQdIRYW9135TuMAW2ZXNi419yWBP0aKb49Aw1rRzNubS+QOy46T15bg+
37
+ BEkAui6mSnKDcp33C4ypieez12Qf1uNgywPE3IjpnSUBAHHLA7QpYCWP+UbRe3Gu
38
+ zVMSW4SOwg/H7ZMZ2cn6j1g0djIvruFQFGHUqFijyDATI+/GJYw2jxyA
39
+ -----END CERTIFICATE-----
@@ -0,0 +1,41 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIHOjCCBiKgAwIBAgIQBH++LkveAITSyvjj7P5wWDANBgkqhkiG9w0BAQUFADBp
3
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
4
+ d3cuZGlnaWNlcnQuY29tMSgwJgYDVQQDEx9EaWdpQ2VydCBIaWdoIEFzc3VyYW5j
5
+ ZSBFViBDQS0xMB4XDTEzMDYxMDAwMDAwMFoXDTE1MDkwMjEyMDAwMFowgfAxHTAb
6
+ BgNVBA8MFFByaXZhdGUgT3JnYW5pemF0aW9uMRMwEQYLKwYBBAGCNzwCAQMTAlVT
7
+ MRkwFwYLKwYBBAGCNzwCAQITCERlbGF3YXJlMRAwDgYDVQQFEwc1MTU3NTUwMRcw
8
+ FQYDVQQJEw41NDggNHRoIFN0cmVldDEOMAwGA1UEERMFOTQxMDcxCzAJBgNVBAYT
9
+ AlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
10
+ MRUwEwYDVQQKEwxHaXRIdWIsIEluYy4xEzARBgNVBAMTCmdpdGh1Yi5jb20wggEi
11
+ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDt04nDXXByCfMzTxpydNm2WpVQ
12
+ u2hhn/f7Hxnh2gQxrxV8Gn/5c68d5UMrVgkARWlK6MRb38J3UlEZW9Er2TllNqAy
13
+ GRxBc/sysj2fmOyCWws3ZDkstxCDcs3w6iRL+tmULsOFFTmpOvaI2vQniaaVT4Si
14
+ N058JXg6yYNtAheVeH1HqFWD7hPIGRqzPPFf/jsC4YX7EWarCV2fTEPwxyReKXIo
15
+ ztR1aE8kcimuOSj8341PTYNzdAxvEZun3WLe/+LrF+b/DL/ALTE71lmi8t2HSkh7
16
+ bTMRFE00nzI49sgZnfG2PcVG71ELisYz7UhhxB0XG718tmfpOc+lUoAK9OrNAgMB
17
+ AAGjggNUMIIDUDAfBgNVHSMEGDAWgBRMWMsl8EFPUvQoyIFDm6aooOaS5TAdBgNV
18
+ HQ4EFgQUh9GPGW7kh29TjHeRB1Dfo79VRyAwJQYDVR0RBB4wHIIKZ2l0aHViLmNv
19
+ bYIOd3d3LmdpdGh1Yi5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsG
20
+ AQUFBwMBBggrBgEFBQcDAjBjBgNVHR8EXDBaMCugKaAnhiVodHRwOi8vY3JsMy5k
21
+ aWdpY2VydC5jb20vZXZjYTEtZzIuY3JsMCugKaAnhiVodHRwOi8vY3JsNC5kaWdp
22
+ Y2VydC5jb20vZXZjYTEtZzIuY3JsMIIBxAYDVR0gBIIBuzCCAbcwggGzBglghkgB
23
+ hv1sAgEwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9z
24
+ c2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4A
25
+ eQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQA
26
+ ZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUA
27
+ IABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAA
28
+ YQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcA
29
+ cgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIA
30
+ aQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQA
31
+ ZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMH0G
32
+ CCsGAQUFBwEBBHEwbzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu
33
+ Y29tMEcGCCsGAQUFBzAChjtodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln
34
+ aUNlcnRIaWdoQXNzdXJhbmNlRVZDQS0xLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqG
35
+ SIb3DQEBBQUAA4IBAQBfFW1nwzrVo94WnEUzJtU9yRZ0NMqHSBsUkG31q0eGufW4
36
+ 4wFFZWjuqRJ1n3Ym7xF8fTjP3fdKGQnxIHKSsE0nuuh/XbQX5DpBJknHdGFoLwY8
37
+ xZ9JPI57vgvzLo8+fwHyZp3Vm/o5IYLEQViSo+nlOSUQ8YAVqu6KcsP/e612UiqS
38
+ +UMBmgdx9KPDDzZy4MJZC2hbfUoXj9A54mJN8cuEOPyw3c3yKOcq/h48KzVguQXi
39
+ SdJbwfqNIbQ9oJM+YzDjzS62+TCtNSNWzWbwABZCmuQxK0oEOSbTmbhxUF7rND3/
40
+ +mx9u8cY//7uAxLWYS5gIZlCbxcf0lkiKSHJB319
41
+ -----END CERTIFICATE-----
@@ -0,0 +1,112 @@
1
+ CONNECTED(00000003)
2
+ ---
3
+ Certificate chain
4
+ 0 s:/businessCategory=Private Organization/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/serialNumber=5157550/street=548 4th Street/postalCode=94107/C=US/ST=California/L=San Francisco/O=GitHub, Inc./CN=github.com
5
+ i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1
6
+ -----BEGIN CERTIFICATE-----
7
+ MIIHOjCCBiKgAwIBAgIQBH++LkveAITSyvjj7P5wWDANBgkqhkiG9w0BAQUFADBp
8
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
9
+ d3cuZGlnaWNlcnQuY29tMSgwJgYDVQQDEx9EaWdpQ2VydCBIaWdoIEFzc3VyYW5j
10
+ ZSBFViBDQS0xMB4XDTEzMDYxMDAwMDAwMFoXDTE1MDkwMjEyMDAwMFowgfAxHTAb
11
+ BgNVBA8MFFByaXZhdGUgT3JnYW5pemF0aW9uMRMwEQYLKwYBBAGCNzwCAQMTAlVT
12
+ MRkwFwYLKwYBBAGCNzwCAQITCERlbGF3YXJlMRAwDgYDVQQFEwc1MTU3NTUwMRcw
13
+ FQYDVQQJEw41NDggNHRoIFN0cmVldDEOMAwGA1UEERMFOTQxMDcxCzAJBgNVBAYT
14
+ AlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2Nv
15
+ MRUwEwYDVQQKEwxHaXRIdWIsIEluYy4xEzARBgNVBAMTCmdpdGh1Yi5jb20wggEi
16
+ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDt04nDXXByCfMzTxpydNm2WpVQ
17
+ u2hhn/f7Hxnh2gQxrxV8Gn/5c68d5UMrVgkARWlK6MRb38J3UlEZW9Er2TllNqAy
18
+ GRxBc/sysj2fmOyCWws3ZDkstxCDcs3w6iRL+tmULsOFFTmpOvaI2vQniaaVT4Si
19
+ N058JXg6yYNtAheVeH1HqFWD7hPIGRqzPPFf/jsC4YX7EWarCV2fTEPwxyReKXIo
20
+ ztR1aE8kcimuOSj8341PTYNzdAxvEZun3WLe/+LrF+b/DL/ALTE71lmi8t2HSkh7
21
+ bTMRFE00nzI49sgZnfG2PcVG71ELisYz7UhhxB0XG718tmfpOc+lUoAK9OrNAgMB
22
+ AAGjggNUMIIDUDAfBgNVHSMEGDAWgBRMWMsl8EFPUvQoyIFDm6aooOaS5TAdBgNV
23
+ HQ4EFgQUh9GPGW7kh29TjHeRB1Dfo79VRyAwJQYDVR0RBB4wHIIKZ2l0aHViLmNv
24
+ bYIOd3d3LmdpdGh1Yi5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsG
25
+ AQUFBwMBBggrBgEFBQcDAjBjBgNVHR8EXDBaMCugKaAnhiVodHRwOi8vY3JsMy5k
26
+ aWdpY2VydC5jb20vZXZjYTEtZzIuY3JsMCugKaAnhiVodHRwOi8vY3JsNC5kaWdp
27
+ Y2VydC5jb20vZXZjYTEtZzIuY3JsMIIBxAYDVR0gBIIBuzCCAbcwggGzBglghkgB
28
+ hv1sAgEwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9z
29
+ c2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4A
30
+ eQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQA
31
+ ZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUA
32
+ IABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAA
33
+ YQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcA
34
+ cgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIA
35
+ aQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQA
36
+ ZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMH0G
37
+ CCsGAQUFBwEBBHEwbzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu
38
+ Y29tMEcGCCsGAQUFBzAChjtodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln
39
+ aUNlcnRIaWdoQXNzdXJhbmNlRVZDQS0xLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqG
40
+ SIb3DQEBBQUAA4IBAQBfFW1nwzrVo94WnEUzJtU9yRZ0NMqHSBsUkG31q0eGufW4
41
+ 4wFFZWjuqRJ1n3Ym7xF8fTjP3fdKGQnxIHKSsE0nuuh/XbQX5DpBJknHdGFoLwY8
42
+ xZ9JPI57vgvzLo8+fwHyZp3Vm/o5IYLEQViSo+nlOSUQ8YAVqu6KcsP/e612UiqS
43
+ +UMBmgdx9KPDDzZy4MJZC2hbfUoXj9A54mJN8cuEOPyw3c3yKOcq/h48KzVguQXi
44
+ SdJbwfqNIbQ9oJM+YzDjzS62+TCtNSNWzWbwABZCmuQxK0oEOSbTmbhxUF7rND3/
45
+ +mx9u8cY//7uAxLWYS5gIZlCbxcf0lkiKSHJB319
46
+ -----END CERTIFICATE-----
47
+ 1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1
48
+ i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA
49
+ -----BEGIN CERTIFICATE-----
50
+ MIIG5jCCBc6gAwIBAgIQAze5KDR8YKauxa2xIX84YDANBgkqhkiG9w0BAQUFADBs
51
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
52
+ d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
53
+ ZSBFViBSb290IENBMB4XDTA3MTEwOTEyMDAwMFoXDTIxMTExMDAwMDAwMFowaTEL
54
+ MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
55
+ LmRpZ2ljZXJ0LmNvbTEoMCYGA1UEAxMfRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
56
+ RVYgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPOWYth1bhn/
57
+ PzR8SU8xfg0ETpmB4rOFVZEwscCvcLssqOcYqj9495BoUoYBiJfiOwZlkKq9ZXbC
58
+ 7L4QWzd4g2B1Rca9dKq2n6Q6AVAXxDlpufFP74LByvNK28yeUE9NQKM6kOeGZrzw
59
+ PnYoTNF1gJ5qNRQ1A57bDIzCKK1Qss72kaPDpQpYSfZ1RGy6+c7pqzoC4E3zrOJ6
60
+ 4GAiBTyC01Li85xH+DvYskuTVkq/cKs+6WjIHY9YHSpNXic9rQpZL1oRIEDZaARo
61
+ LfTAhAsKG3jf7RpY3PtBWm1r8u0c7lwytlzs16YDMqbo3rcoJ1mIgP97rYlY1R4U
62
+ pPKwcNSgPqcCAwEAAaOCA4UwggOBMA4GA1UdDwEB/wQEAwIBhjA7BgNVHSUENDAy
63
+ BggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDBAYIKwYBBQUH
64
+ AwgwggHEBgNVHSAEggG7MIIBtzCCAbMGCWCGSAGG/WwCATCCAaQwOgYIKwYBBQUH
65
+ AgEWLmh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5o
66
+ dG0wggFkBggrBgEFBQcCAjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0
67
+ AGgAaQBzACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1
68
+ AHQAZQBzACAAYQBjAGMAZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABp
69
+ AGcAaQBDAGUAcgB0ACAARQBWACAAQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBl
70
+ AGwAeQBpAG4AZwAgAFAAYQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBo
71
+ AGkAYwBoACAAbABpAG0AaQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAg
72
+ AGEAcgBlACAAaQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAg
73
+ AGIAeQAgAHIAZQBmAGUAcgBlAG4AYwBlAC4wEgYDVR0TAQH/BAgwBgEB/wIBADCB
74
+ gwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
75
+ dC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NBQ2Vy
76
+ dHMvRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3J0MIGPBgNVHR8EgYcw
77
+ gYQwQKA+oDyGOmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hB
78
+ c3N1cmFuY2VFVlJvb3RDQS5jcmwwQKA+oDyGOmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0
79
+ LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5jcmwwHQYDVR0OBBYE
80
+ FExYyyXwQU9S9CjIgUObpqig5pLlMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSYJhoI
81
+ Au9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQBMeheHKF0XvLIyc7/NLvVYMR3wsXFU
82
+ nNabZ5PbLwM+Fm8eA8lThKNWYB54lBuiqG+jpItSkdfdXJW777UWSemlQk808kf/
83
+ roF/E1S3IMRwFcuBCoHLdFfcnN8kpCkMGPAc5K4HM+zxST5Vz25PDVR708noFUjU
84
+ xbvcNRx3RQdIRYW9135TuMAW2ZXNi419yWBP0aKb49Aw1rRzNubS+QOy46T15bg+
85
+ BEkAui6mSnKDcp33C4ypieez12Qf1uNgywPE3IjpnSUBAHHLA7QpYCWP+UbRe3Gu
86
+ zVMSW4SOwg/H7ZMZ2cn6j1g0djIvruFQFGHUqFijyDATI+/GJYw2jxyA
87
+ -----END CERTIFICATE-----
88
+ ---
89
+ Server certificate
90
+ subject=/businessCategory=Private Organization/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/serialNumber=5157550/street=548 4th Street/postalCode=94107/C=US/ST=California/L=San Francisco/O=GitHub, Inc./CN=github.com
91
+ issuer=/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1
92
+ ---
93
+ No client certificate CA names sent
94
+ ---
95
+ SSL handshake has read 3796 bytes and written 456 bytes
96
+ ---
97
+ New, TLSv1/SSLv3, Cipher is AES128-SHA
98
+ Server public key is 2048 bit
99
+ Secure Renegotiation IS supported
100
+ Compression: NONE
101
+ Expansion: NONE
102
+ SSL-Session:
103
+ Protocol : TLSv1
104
+ Cipher : AES128-SHA
105
+ Session-ID: 68A4FF6A1FAFD9EF2AC080C4E9A42433A0C27815CB17F0A6C24B455E17A49D0B
106
+ Session-ID-ctx:
107
+ Master-Key: 324790F1157F795B7716645002F4E5515CF874B8AF64370245B67C45B4CBFF50A71CA54E5FDDF8AEE58ED4201C127B64
108
+ Key-Arg : None
109
+ Start Time: 1391730515
110
+ Timeout : 300 (sec)
111
+ Verify return code: 0 (ok)
112
+ ---
@@ -0,0 +1,94 @@
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number: 7353680 (0x703550)
5
+ Signature Algorithm: sha1WithRSAEncryption
6
+ Issuer: C=US, ST=Florida, L=Miami, O=Basho, OU=Riak Ruby Client, CN=CA/emailAddress=bryce@basho.com
7
+ Validity
8
+ Not Before: Feb 5 16:29:00 2014 GMT
9
+ Not After : Feb 3 16:29:00 2024 GMT
10
+ Subject: C=US, ST=Florida, O=Basho, OU=Riak Ruby client, CN=localhost/emailAddress=bryce@basho.com
11
+ Subject Public Key Info:
12
+ Public Key Algorithm: rsaEncryption
13
+ Public-Key: (2048 bit)
14
+ Modulus:
15
+ 00:cc:37:29:ad:9d:f1:93:6f:6c:61:ba:14:ac:70:
16
+ 98:7d:5c:11:97:64:6e:10:72:7a:81:d0:97:c7:5d:
17
+ b3:5e:6b:ed:57:29:eb:54:3b:ee:c8:40:3c:57:54:
18
+ 7f:1a:0f:66:f7:8d:4c:49:d0:56:3f:8f:27:6a:1c:
19
+ 98:31:4d:c5:d5:01:50:6a:e3:d2:a4:19:65:b6:38:
20
+ b8:81:c9:e7:46:51:79:8b:1a:92:ee:a4:d8:0e:ef:
21
+ dc:4b:1d:08:ec:b8:13:22:7c:85:7f:ff:a3:ef:bc:
22
+ 23:ba:dd:b4:e8:bf:f3:6a:e9:3c:89:fc:9c:b9:7d:
23
+ 1e:a5:61:b0:fe:b5:74:e2:ab:9e:42:7d:9e:f0:ee:
24
+ 28:5a:d4:fb:b5:fc:d0:05:6c:72:cf:04:6a:d4:6d:
25
+ 5f:f9:eb:97:a8:cf:fa:79:ee:82:ed:00:47:18:80:
26
+ a3:9f:2e:86:74:c4:6e:b9:e1:da:d1:87:1c:10:d5:
27
+ f3:87:fb:71:ce:55:ee:7e:53:f2:88:b6:15:aa:a9:
28
+ 4e:d0:b4:a2:27:04:3b:af:61:88:2a:b3:c1:90:c0:
29
+ 41:d7:e0:43:63:ee:55:b7:3a:f4:c3:56:c7:88:d4:
30
+ c9:4e:ca:55:9d:d4:3f:30:7c:ea:34:8a:5c:31:90:
31
+ 0b:ad:7f:35:cc:b8:0d:5a:f4:f4:f1:2b:86:0a:c2:
32
+ df:4f
33
+ Exponent: 65537 (0x10001)
34
+ X509v3 extensions:
35
+ X509v3 Basic Constraints:
36
+ CA:FALSE
37
+ Netscape Cert Type:
38
+ SSL Client, SSL Server
39
+ X509v3 Key Usage:
40
+ Digital Signature, Non Repudiation, Key Encipherment
41
+ Netscape Comment:
42
+ Riak Ruby Client Testing Certificate
43
+ X509v3 Subject Key Identifier:
44
+ CD:69:91:9F:7F:4F:EC:4D:76:95:87:41:D4:A7:5F:62:9C:E2:7F:8A
45
+ X509v3 Authority Key Identifier:
46
+ DirName:/C=US/ST=Florida/L=Miami/O=Basho/OU=Riak Ruby Client/CN=CA/emailAddress=bryce@basho.com
47
+ serial:EB:90:D4:88:07:71:2D:B0
48
+
49
+ X509v3 Extended Key Usage:
50
+ TLS Web Server Authentication, TLS Web Client Authentication
51
+ Signature Algorithm: sha1WithRSAEncryption
52
+ 39:20:28:de:26:20:af:e3:d2:59:92:a9:43:95:b9:25:83:2e:
53
+ 6e:a2:32:66:53:a8:ef:6b:96:b1:44:8f:74:3f:f2:01:6f:96:
54
+ af:3b:70:67:1a:1e:39:68:6a:57:b0:b8:89:e7:ed:50:34:ef:
55
+ 53:bd:96:68:94:ab:8b:3f:f7:20:be:1a:52:80:0a:11:ee:dc:
56
+ dc:93:01:11:3d:91:e5:93:d8:0c:b0:05:44:fa:a7:d1:c9:32:
57
+ be:58:58:48:40:66:dd:8f:bc:b0:02:84:05:c3:e8:e4:77:f9:
58
+ ff:a9:09:b7:a0:9b:3a:ea:a5:c9:02:8f:eb:30:aa:f6:92:bf:
59
+ 38:ef:fb:6c:5d:e5:7b:c7:57:86:74:06:ca:e5:86:70:40:35:
60
+ 50:51:df:28:44:fa:d0:a3:30:ae:aa:71:34:32:a5:dc:f7:7e:
61
+ 70:a7:ed:c1:e7:20:77:a0:27:16:00:4d:74:90:5a:29:9b:b3:
62
+ 43:5f:0b:b2:4e:d5:c8:8f:ab:e6:92:f5:57:b0:b4:f8:fd:be:
63
+ a1:12:9f:06:fa:5e:da:bd:1c:fc:08:e4:d8:de:5e:82:a8:dc:
64
+ 8b:3b:61:b5:65:ce:b3:2c:a0:fc:8e:a1:28:33:ca:a5:b8:0a:
65
+ 45:29:b8:ba:ab:f1:77:42:e5:a8:2d:b7:67:6c:75:18:f4:ce:
66
+ 91:ea:62:80
67
+ -----BEGIN CERTIFICATE-----
68
+ MIIE0DCCA7igAwIBAgIDcDVQMA0GCSqGSIb3DQEBBQUAMIGHMQswCQYDVQQGEwJV
69
+ UzEQMA4GA1UECAwHRmxvcmlkYTEOMAwGA1UEBwwFTWlhbWkxDjAMBgNVBAoMBUJh
70
+ c2hvMRkwFwYDVQQLDBBSaWFrIFJ1YnkgQ2xpZW50MQswCQYDVQQDDAJDQTEeMBwG
71
+ CSqGSIb3DQEJARYPYnJ5Y2VAYmFzaG8uY29tMB4XDTE0MDIwNTE2MjkwMFoXDTI0
72
+ MDIwMzE2MjkwMFowfjELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB0Zsb3JpZGExDjAM
73
+ BgNVBAoMBUJhc2hvMRkwFwYDVQQLDBBSaWFrIFJ1YnkgY2xpZW50MRIwEAYDVQQD
74
+ DAlsb2NhbGhvc3QxHjAcBgkqhkiG9w0BCQEWD2JyeWNlQGJhc2hvLmNvbTCCASIw
75
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMw3Ka2d8ZNvbGG6FKxwmH1cEZdk
76
+ bhByeoHQl8dds15r7Vcp61Q77shAPFdUfxoPZveNTEnQVj+PJ2ocmDFNxdUBUGrj
77
+ 0qQZZbY4uIHJ50ZReYsaku6k2A7v3EsdCOy4EyJ8hX//o++8I7rdtOi/82rpPIn8
78
+ nLl9HqVhsP61dOKrnkJ9nvDuKFrU+7X80AVscs8EatRtX/nrl6jP+nnugu0ARxiA
79
+ o58uhnTEbrnh2tGHHBDV84f7cc5V7n5T8oi2FaqpTtC0oicEO69hiCqzwZDAQdfg
80
+ Q2PuVbc69MNWx4jUyU7KVZ3UPzB86jSKXDGQC61/Ncy4DVr09PErhgrC308CAwEA
81
+ AaOCAUswggFHMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgbAMAsGA1UdDwQE
82
+ AwIF4DAzBglghkgBhvhCAQ0EJhYkUmlhayBSdWJ5IENsaWVudCBUZXN0aW5nIENl
83
+ cnRpZmljYXRlMB0GA1UdDgQWBBTNaZGff0/sTXaVh0HUp19inOJ/ijCBpgYDVR0j
84
+ BIGeMIGboYGNpIGKMIGHMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHRmxvcmlkYTEO
85
+ MAwGA1UEBwwFTWlhbWkxDjAMBgNVBAoMBUJhc2hvMRkwFwYDVQQLDBBSaWFrIFJ1
86
+ YnkgQ2xpZW50MQswCQYDVQQDDAJDQTEeMBwGCSqGSIb3DQEJARYPYnJ5Y2VAYmFz
87
+ aG8uY29tggkA65DUiAdxLbAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
88
+ MA0GCSqGSIb3DQEBBQUAA4IBAQA5ICjeJiCv49JZkqlDlbklgy5uojJmU6jva5ax
89
+ RI90P/IBb5avO3BnGh45aGpXsLiJ5+1QNO9TvZZolKuLP/cgvhpSgAoR7tzckwER
90
+ PZHlk9gMsAVE+qfRyTK+WFhIQGbdj7ywAoQFw+jkd/n/qQm3oJs66qXJAo/rMKr2
91
+ kr847/tsXeV7x1eGdAbK5YZwQDVQUd8oRPrQozCuqnE0MqXc935wp+3B5yB3oCcW
92
+ AE10kFopm7NDXwuyTtXIj6vmkvVXsLT4/b6hEp8G+l7avRz8COTY3l6CqNyLO2G1
93
+ Zc6zLKD8jqEoM8qluApFKbi6q/F3QuWoLbdnbHUY9M6R6mKA
94
+ -----END CERTIFICATE-----
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ describe R509::Cert::Validator do
4
+ let(:issuer_cert){ cert('root.crt') }
5
+
6
+ describe 'with a cert without CRL or OCSP data' do
7
+ let(:no_validator_cert){ cert('empty.crt') }
8
+ subject{ described_class.new no_validator_cert }
9
+
10
+ it 'should validate' do
11
+ expect{ subject.validate }.to_not raise_error
12
+ end
13
+
14
+ it 'should refuse to validate with CRL or OCSP' do
15
+ expect{ subject.validate crl: true }.to raise_error
16
+ expect{ subject.validate ocsp: true }.to raise_error
17
+ end
18
+ end
19
+
20
+ describe 'with a cert with CRL and OCSP data' do
21
+ let(:good_cert){ cert('good.crt') }
22
+ subject{ described_class.new good_cert, issuer_cert }
23
+
24
+ it 'should validate against a CRL' do
25
+ expect{ subject.validate crl: true, ocsp: false }.to_not raise_error
26
+ end
27
+
28
+ it 'should validate a cert against OCSP' do
29
+ expect{ subject.validate crl: false, ocsp: true }.to_not raise_error
30
+ end
31
+ end
32
+
33
+ describe 'with a cert with CRL and no OCSP' do
34
+ let(:crl_only_cert){ cert('crl_only.crt') }
35
+ subject{ described_class.new crl_only_cert, issuer_cert }
36
+
37
+ it 'should validate against a CRL' do
38
+ expect{ subject.validate crl: true, ocsp: false }.to_not raise_error
39
+ end
40
+
41
+ it 'should fail to validate against OCSP' do
42
+ expect{ subject.validate crl: false, ocsp: true }.to raise_error
43
+ end
44
+ end
45
+
46
+ describe 'with a cert with OCSP and no CRL' do
47
+ let(:ocsp_only_cert){ cert('ocsp_only.crt') }
48
+ subject{ described_class.new ocsp_only_cert, issuer_cert }
49
+
50
+ it 'should fail to validate against a CRL' do
51
+ expect{ subject.validate crl: true, ocsp: false }.to raise_error
52
+ end
53
+
54
+ it 'should validate against OCSP' do
55
+ expect{ subject.validate crl: false, ocsp: true }.to_not raise_error
56
+ end
57
+ end
58
+
59
+ describe 'with a revoked cert' do
60
+ let(:revoked_cert){ cert('revoked.crt') }
61
+ subject{ described_class.new revoked_cert, issuer_cert }
62
+
63
+ it 'should validate false against a CRL' do
64
+ expect(subject.validate crl: true, ocsp: false).to_not be
65
+ expect{ subject.validate! crl: true, ocsp: false }.to raise_error /revoked/
66
+ end
67
+
68
+ it 'should validate false against OCSP' do
69
+ expect(subject.validate crl: false, ocsp: true).to_not be
70
+ expect{ subject.validate! crl: false, ocsp: true }.to raise_error /revoked/
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bash
2
+ bundle exec rake ca:all
3
+ bundle exec ruby spec/support/ca_server.rb &
4
+ sleep 5
5
+ bundle exec rspec
metadata ADDED
@@ -0,0 +1,197 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: r509-cert-validator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Bryce Kerley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 10.1.1
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 10.1.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 2.14.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.14.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.5.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 1.5.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: puma
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 2.7.1
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 2.7.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: r509-ocsp-responder
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 0.3.3
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 0.3.3
97
+ - !ruby/object:Gem::Dependency
98
+ name: r509-validity-crl
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 0.1.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 0.1.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: r509
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.10.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 0.10.0
125
+ description: Tool for validating x509 certificates against CRLs and OCSP.
126
+ email:
127
+ - bkerley@brycekerley.net
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - .gitignore
133
+ - .rspec
134
+ - .travis.yml
135
+ - Gemfile
136
+ - LICENSE.txt
137
+ - README.md
138
+ - Rakefile
139
+ - lib/r509-cert-validator.rb
140
+ - lib/r509/cert/validator.rb
141
+ - lib/r509/cert/validator/basic_validator.rb
142
+ - lib/r509/cert/validator/crl_validator.rb
143
+ - lib/r509/cert/validator/errors.rb
144
+ - lib/r509/cert/validator/ocsp_validator.rb
145
+ - lib/r509/cert/validator/version.rb
146
+ - lib/tasks/ca.rb
147
+ - lib/tasks/helper.rb
148
+ - r509-cert-validator.gemspec
149
+ - spec/spec_helper.rb
150
+ - spec/support/ca/.gitignore
151
+ - spec/support/ca/config.yaml.erb
152
+ - spec/support/ca_server.rb
153
+ - spec/support/certs/README.md
154
+ - spec/support/certs/ca.crt
155
+ - spec/support/certs/digicert_ev.crt
156
+ - spec/support/certs/github.crt
157
+ - spec/support/certs/github_chain.crt
158
+ - spec/support/certs/no_validator.crt
159
+ - spec/validator_spec.rb
160
+ - travis.sh
161
+ homepage: ''
162
+ licenses:
163
+ - MIT
164
+ metadata: {}
165
+ post_install_message:
166
+ rdoc_options: []
167
+ require_paths:
168
+ - lib
169
+ required_ruby_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ~>
172
+ - !ruby/object:Gem::Version
173
+ version: '2.0'
174
+ required_rubygems_version: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - '>='
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ requirements: []
180
+ rubyforge_project:
181
+ rubygems_version: 2.0.14
182
+ signing_key:
183
+ specification_version: 4
184
+ summary: An r509-based tool for validating x509 certificates against CRLs and OCSP.
185
+ test_files:
186
+ - spec/spec_helper.rb
187
+ - spec/support/ca/.gitignore
188
+ - spec/support/ca/config.yaml.erb
189
+ - spec/support/ca_server.rb
190
+ - spec/support/certs/README.md
191
+ - spec/support/certs/ca.crt
192
+ - spec/support/certs/digicert_ev.crt
193
+ - spec/support/certs/github.crt
194
+ - spec/support/certs/github_chain.crt
195
+ - spec/support/certs/no_validator.crt
196
+ - spec/validator_spec.rb
197
+ has_rdoc: