r509-cert-validator 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +1 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +70 -0
- data/Rakefile +8 -0
- data/lib/r509-cert-validator.rb +1 -0
- data/lib/r509/cert/validator.rb +62 -0
- data/lib/r509/cert/validator/basic_validator.rb +24 -0
- data/lib/r509/cert/validator/crl_validator.rb +40 -0
- data/lib/r509/cert/validator/errors.rb +14 -0
- data/lib/r509/cert/validator/ocsp_validator.rb +87 -0
- data/lib/r509/cert/validator/version.rb +7 -0
- data/lib/tasks/ca.rb +112 -0
- data/lib/tasks/helper.rb +33 -0
- data/r509-cert-validator.gemspec +31 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/ca/.gitignore +5 -0
- data/spec/support/ca/config.yaml.erb +35 -0
- data/spec/support/ca_server.rb +29 -0
- data/spec/support/certs/README.md +15 -0
- data/spec/support/certs/ca.crt +21 -0
- data/spec/support/certs/digicert_ev.crt +39 -0
- data/spec/support/certs/github.crt +41 -0
- data/spec/support/certs/github_chain.crt +112 -0
- data/spec/support/certs/no_validator.crt +94 -0
- data/spec/validator_spec.rb +73 -0
- data/travis.sh +5 -0
- metadata +197 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -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.
|
data/README.md
ADDED
@@ -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
|
data/Rakefile
ADDED
@@ -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,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
|
data/lib/tasks/ca.rb
ADDED
@@ -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
|
data/lib/tasks/helper.rb
ADDED
@@ -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
|
data/spec/spec_helper.rb
ADDED
@@ -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,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
|
data/travis.sh
ADDED
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:
|