cert_validator 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/.rspec +4 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +55 -0
- data/Rakefile +6 -0
- data/cert_validator.gemspec +24 -0
- data/lib/cert_validator.rb +40 -0
- data/lib/cert_validator/asn1.rb +15 -0
- data/lib/cert_validator/crl/extractor.rb +48 -0
- data/lib/cert_validator/crl_validator.rb +93 -0
- data/lib/cert_validator/errors.rb +81 -0
- data/lib/cert_validator/ocsp.rb +13 -0
- data/lib/cert_validator/ocsp/extractor.rb +52 -0
- data/lib/cert_validator/ocsp/null_validator.rb +17 -0
- data/lib/cert_validator/ocsp/real_validator.rb +117 -0
- data/lib/cert_validator/version.rb +3 -0
- data/lib/tasks/ca.rb +112 -0
- data/lib/tasks/helper.rb +36 -0
- data/spec/cert_validator_spec.rb +73 -0
- data/spec/crl_extractor_spec.rb +42 -0
- data/spec/crl_validator_spec.rb +59 -0
- data/spec/null_ocsp_validator_spec.rb +19 -0
- data/spec/ocsp_extractor_spec.rb +31 -0
- data/spec/ocsp_validator_spec.rb +34 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/ca/crl_only.crt +15 -0
- data/spec/support/ca/digicert.crl +0 -0
- data/spec/support/ca/empty.crt +13 -0
- data/spec/support/ca/github.crt +34 -0
- data/spec/support/ca/good.crt +16 -0
- data/spec/support/ca/mismatched.crl +13 -0
- data/spec/support/ca/ocsp_only.crt +15 -0
- data/spec/support/ca/revoked.crl +9 -0
- data/spec/support/ca/revoked.crt +16 -0
- data/spec/support/ca/root.crt +14 -0
- data/spec/support/ca/root.key +9 -0
- data/spec/support/certs.rb +17 -0
- data/spec/support/ocsp_guard.rb +2 -0
- data/spec/support/validator_expectations.rb +13 -0
- metadata +150 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
describe CertValidator::CrlValidator do
|
2
|
+
subject { described_class.new good_cert, ca }
|
3
|
+
let(:ca){ cert 'root' }
|
4
|
+
let(:good_cert){ cert 'good' }
|
5
|
+
let(:revoked_cert){ cert 'revoked' }
|
6
|
+
let(:empty_cert){ cert 'empty' }
|
7
|
+
let(:crl_data){ crl 'revoked' }
|
8
|
+
let(:mismatched_crl_data){ crl 'mismatched' }
|
9
|
+
|
10
|
+
it 'accepts a certificate on construction' do
|
11
|
+
expect{ described_class.new good_cert, ca }.to_not raise_error
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'accepts OpenSSL CRL data to replace hitting a URL for it' do
|
15
|
+
expect{ subject.crl = crl_data }.to_not raise_error
|
16
|
+
expect(subject.available?).to be
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'with a good cert and matching CRL data' do
|
20
|
+
subject do
|
21
|
+
described_class.new(good_cert, ca).tap do |v|
|
22
|
+
v.crl = crl_data
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it { is_expected.to be_available }
|
27
|
+
it { is_expected.to be_valid }
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'with a revoked cert and matching CRL data' do
|
31
|
+
subject do
|
32
|
+
described_class.new(revoked_cert, ca).tap do |v|
|
33
|
+
v.crl = crl_data
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it { is_expected.to be_available }
|
38
|
+
it { is_expected.to_not be_valid }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'with irrelevant CRL data' do
|
42
|
+
subject do
|
43
|
+
described_class.new(good_cert, ca).tap do |v|
|
44
|
+
v.crl = mismatched_crl_data
|
45
|
+
end
|
46
|
+
end
|
47
|
+
it { is_expected.to be_available }
|
48
|
+
it { is_expected.to_not be_valid }
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'with no CRL data' do
|
52
|
+
subject do
|
53
|
+
described_class.new(empty_cert, ca)
|
54
|
+
end
|
55
|
+
|
56
|
+
it { is_expected.to_not be_available }
|
57
|
+
it { is_expected.to_not be_valid }
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'cert_validator/ocsp/null_validator'
|
2
|
+
|
3
|
+
describe CertValidator::NullOcspValidator do
|
4
|
+
subject{ described_class.new good_cert, ca }
|
5
|
+
let(:ca){ cert 'root' }
|
6
|
+
let(:good_cert){ cert 'good' }
|
7
|
+
|
8
|
+
it 'accepts a certificate and CA on construction' do
|
9
|
+
expect{ described_class.new good_cert, ca }.to_not raise_error
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'with a good cert and CA' do
|
13
|
+
it { is_expected.to_not be_available }
|
14
|
+
|
15
|
+
it 'raises an error when asked to validate' do
|
16
|
+
expect{ subject.valid? }.to raise_error CertValidator::OcspNotAvailableError
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'cert_validator/ocsp/extractor'
|
2
|
+
|
3
|
+
describe CertValidator::RealOcspValidator::Extractor do
|
4
|
+
it 'accepts a certificate on construction' do
|
5
|
+
expect{ described_class.new cert 'good' }.to_not raise_error
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'with one OCSP endpoint' do
|
9
|
+
subject { described_class.new cert 'good' }
|
10
|
+
|
11
|
+
it 'has an OCSP extension' do
|
12
|
+
expect(subject.has_ocsp_extension?).to be
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'extracts the OCSP endpoint' do
|
16
|
+
expect(subject.endpoint).to eq 'http://cert-validator-test.herokuapp.com/ocsp'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'with no OCSP endpoint' do
|
21
|
+
subject { described_class.new cert 'crl_only' }
|
22
|
+
|
23
|
+
it 'has no OCSP extension' do
|
24
|
+
expect(subject.has_ocsp_extension?).to_not be
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'extracts no OCSP endpoint' do
|
28
|
+
expect(subject.endpoint).to be_nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'cert_validator/ocsp/real_validator'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
describe CertValidator::RealOcspValidator, real_ocsp: true do
|
5
|
+
subject{ described_class.new good_cert, ca }
|
6
|
+
let(:ca){ cert 'root' }
|
7
|
+
let(:good_cert){ cert 'good' }
|
8
|
+
|
9
|
+
it 'accepts a certificate and CA on construction' do
|
10
|
+
expect{ described_class.new good_cert, ca }.to_not raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'with a good cert' do
|
14
|
+
it { is_expected.to be_available }
|
15
|
+
it { is_expected.to be_valid }
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'with a revoked cert' do
|
19
|
+
subject { described_class.new cert('revoked'), ca }
|
20
|
+
it { is_expected.to be_available }
|
21
|
+
it { is_expected.to_not be_valid }
|
22
|
+
end
|
23
|
+
|
24
|
+
pending 'with an irrelevant OCSP response' do
|
25
|
+
it { is_expected.to be_available }
|
26
|
+
it { is_expected.to_not be_valid }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'with a cert with no OCSP data' do
|
30
|
+
subject { described_class.new cert('crl_only'), ca }
|
31
|
+
it { is_expected.to_not be_available }
|
32
|
+
it { is_expected.to_not be_valid }
|
33
|
+
end
|
34
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'cert_validator'
|
2
|
+
%w{certs validator_expectations}.each do |f|
|
3
|
+
require_relative "./support/#{f}"
|
4
|
+
end
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
|
8
|
+
config.include Certs
|
9
|
+
|
10
|
+
if defined? OpenSSL::OCSP
|
11
|
+
config.filter_run_excluding null_ocsp: true
|
12
|
+
else
|
13
|
+
config.filter_run_excluding real_ocsp: true
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIICUDCCAfqgAwIBAgITBlDD3tpGAKR6eYnuUp6BHhl/oTANBgkqhkiG9w0BAQUF
|
3
|
+
ADBhMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHRmxvcmlkYTEOMAwGA1UEBwwFTWlh
|
4
|
+
bWkxHDAaBgNVBAoME3I1MDktY2VydC12YWxpZGF0b3IxEjAQBgNVBAMMCWxvY2Fs
|
5
|
+
aG9zdDAeFw0xNDA4MTgxNjMwNTNaFw0xNTA4MTgxNjMwNTNaMGExCzAJBgNVBAYT
|
6
|
+
AlVTMRAwDgYDVQQIDAdGbG9yaWRhMQ4wDAYDVQQHDAVNaWFtaTEcMBoGA1UECgwT
|
7
|
+
cjUwOS1jZXJ0LXZhbGlkYXRvcjESMBAGA1UEAwwJbG9jYWxob3N0MFwwDQYJKoZI
|
8
|
+
hvcNAQEBBQADSwAwSAJBAMYnb+qH8hUAv1t/OiLlN1S8H9GeEdYPmxFRfPdi7kxy
|
9
|
+
07uSLd7GwECamr88beyxd/k+Hshwqvbc2aH2Jy1UifcCAwEAAaOBijCBhzAdBgNV
|
10
|
+
HQ4EFgQUnkH8OtJt4erTy0qbCRGNtijd9JwwHwYDVR0jBBgwFoAUpWpVTvQF6qq/
|
11
|
+
XnR6wLqe3OhV1q8wRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL2NlcnQtdmFsaWRh
|
12
|
+
dG9yLXRlc3QuaGVyb2t1YXBwLmNvbS9yZXZva2VkLmNybDANBgkqhkiG9w0BAQUF
|
13
|
+
AANBAGb7XHWaLgQJPqSduN6Pt99ZvmEiH/+VPEfBBUkb+1FnfUsbyKdMl9oVTbFS
|
14
|
+
0L5gqimm3ryuKG/t7t/hjo5cScU=
|
15
|
+
-----END CERTIFICATE-----
|
Binary file
|
@@ -0,0 +1,13 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIICBzCCAbGgAwIBAgITBlDD3tpwd/fvU138B/YOHbu/kzANBgkqhkiG9w0BAQUF
|
3
|
+
ADBhMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHRmxvcmlkYTEOMAwGA1UEBwwFTWlh
|
4
|
+
bWkxHDAaBgNVBAoME3I1MDktY2VydC12YWxpZGF0b3IxEjAQBgNVBAMMCWxvY2Fs
|
5
|
+
aG9zdDAeFw0xNDA4MTgxNjMwNTNaFw0xNTA4MTgxNjMwNTNaMGExCzAJBgNVBAYT
|
6
|
+
AlVTMRAwDgYDVQQIDAdGbG9yaWRhMQ4wDAYDVQQHDAVNaWFtaTEcMBoGA1UECgwT
|
7
|
+
cjUwOS1jZXJ0LXZhbGlkYXRvcjESMBAGA1UEAwwJbG9jYWxob3N0MFwwDQYJKoZI
|
8
|
+
hvcNAQEBBQADSwAwSAJBAKupO4YL7W/YUnIsAKiPCoDOQQzhxOMJ8/8ggrduhzTo
|
9
|
+
CaPFhKsyAt3fFK/hgKiIWmhXx1xXZ4pZy43NO/RjvEUCAwEAAaNCMEAwHQYDVR0O
|
10
|
+
BBYEFLrt5qDb2oRSdDLgprfOM5d5lqZcMB8GA1UdIwQYMBaAFKVqVU70Beqqv150
|
11
|
+
esC6ntzoVdavMA0GCSqGSIb3DQEBBQUAA0EAokhoIY/qlqBD/BIaBAG39tgL+YWl
|
12
|
+
+QqDY3BfgdaPD/XZfuBqiOluv6k4tytfN12TnpWdwS9MPlXPuQ9lZE2WuQ==
|
13
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,34 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIF4DCCBMigAwIBAgIQDACTENIG2+M3VTWAEY3chzANBgkqhkiG9w0BAQsFADB1
|
3
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
4
|
+
d3cuZGlnaWNlcnQuY29tMTQwMgYDVQQDEytEaWdpQ2VydCBTSEEyIEV4dGVuZGVk
|
5
|
+
IFZhbGlkYXRpb24gU2VydmVyIENBMB4XDTE0MDQwODAwMDAwMFoXDTE2MDQxMjEy
|
6
|
+
MDAwMFowgfAxHTAbBgNVBA8MFFByaXZhdGUgT3JnYW5pemF0aW9uMRMwEQYLKwYB
|
7
|
+
BAGCNzwCAQMTAlVTMRkwFwYLKwYBBAGCNzwCAQITCERlbGF3YXJlMRAwDgYDVQQF
|
8
|
+
Ewc1MTU3NTUwMRcwFQYDVQQJEw41NDggNHRoIFN0cmVldDEOMAwGA1UEERMFOTQx
|
9
|
+
MDcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
|
10
|
+
YW4gRnJhbmNpc2NvMRUwEwYDVQQKEwxHaXRIdWIsIEluYy4xEzARBgNVBAMTCmdp
|
11
|
+
dGh1Yi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx1Nw8r/3z
|
12
|
+
Tu3BZ63myyLot+KrKPL33GJwCNEMr9YWaiGwNksXDTZjBK6/6iBRlWVm8r+5TaQM
|
13
|
+
Kev1FbHoNbNwEJTVG1m0Jg/Wg1dZneF8Cd3gE8pNb0Obzc+HOhWnhd1mg+2TDP4r
|
14
|
+
bTgceYiQz61YGC1R0cKj8keMbzgJubjvTJMLy4OUh+rgo7XZe5trD0P5yu6ADSin
|
15
|
+
dvEl9ME1PPZ0rd5qM4J73P1LdqfC7vJqv6kkpl/nLnwO28N0c/p+xtjPYOs2ViG2
|
16
|
+
wYq4JIJNeCS66R2hiqeHvmYlab++O3JuT+DkhSUIsZGJuNZ0ZXabLE9iH6H6Or6c
|
17
|
+
JL+fyrDFwGeNAgMBAAGjggHuMIIB6jAfBgNVHSMEGDAWgBQ901Cl1qCt7vNKYApl
|
18
|
+
0yHU+PjWDzAdBgNVHQ4EFgQUakOQfTuYFHJSlTqqKApD+FF+06YwJQYDVR0RBB4w
|
19
|
+
HIIKZ2l0aHViLmNvbYIOd3d3LmdpdGh1Yi5jb20wDgYDVR0PAQH/BAQDAgWgMB0G
|
20
|
+
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjB1BgNVHR8EbjBsMDSgMqAwhi5o
|
21
|
+
dHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1ldi1zZXJ2ZXItZzEuY3JsMDSg
|
22
|
+
MqAwhi5odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc2hhMi1ldi1zZXJ2ZXItZzEu
|
23
|
+
Y3JsMEIGA1UdIAQ7MDkwNwYJYIZIAYb9bAIBMCowKAYIKwYBBQUHAgEWHGh0dHBz
|
24
|
+
Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgYgGCCsGAQUFBwEBBHwwejAkBggrBgEF
|
25
|
+
BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFIGCCsGAQUFBzAChkZodHRw
|
26
|
+
Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEyRXh0ZW5kZWRWYWxp
|
27
|
+
ZGF0aW9uU2VydmVyQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQAD
|
28
|
+
ggEBAG/nbcuC8++QhwnXDxUiLIz+06scipbbXRJd0XjAMbD/RciJ9wiYUhcfTEsg
|
29
|
+
ZGpt21DXEL5+q/4vgNipSlhBaYFyGQiDm5IQTmIte0ZwQ26jUxMf4pOmI1v3kj43
|
30
|
+
FHU7uUskQS6lPUgND5nqHkKXxv6V2qtHmssrA9YNQMEK93ga2rWDpK21mUkgLviT
|
31
|
+
PB5sPdE7IzprOCp+Ynpf3RcFddAkXb6NqJoQRPrStMrv19C1dqUmJRwIQdhkkqev
|
32
|
+
ff6IQDlhC8BIMKmCNK33cEYDfDWROtW7JNgBvBTwww8jO1gyug8SbGZ6bZ3k8OV8
|
33
|
+
XX4C2NesiZcLYbc2n7B9O+63M2k=
|
34
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,16 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIICmzCCAkWgAwIBAgITBlDD3tnoYCMw1nYyk5g/+ehFkTANBgkqhkiG9w0BAQUF
|
3
|
+
ADBhMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHRmxvcmlkYTEOMAwGA1UEBwwFTWlh
|
4
|
+
bWkxHDAaBgNVBAoME3I1MDktY2VydC12YWxpZGF0b3IxEjAQBgNVBAMMCWxvY2Fs
|
5
|
+
aG9zdDAeFw0xNDA4MTgxNjMwNTNaFw0xNTA4MTgxNjMwNTNaMGExCzAJBgNVBAYT
|
6
|
+
AlVTMRAwDgYDVQQIDAdGbG9yaWRhMQ4wDAYDVQQHDAVNaWFtaTEcMBoGA1UECgwT
|
7
|
+
cjUwOS1jZXJ0LXZhbGlkYXRvcjESMBAGA1UEAwwJbG9jYWxob3N0MFwwDQYJKoZI
|
8
|
+
hvcNAQEBBQADSwAwSAJBANQTxRioShTbbMynU6Qm5KLf7iCgmw4tH6kF1tezrO5+
|
9
|
+
SptbxUo5W5MfYOuSdvmVGeHLx/ttPI0JyJppcY+u5IMCAwEAAaOB1TCB0jAdBgNV
|
10
|
+
HQ4EFgQUpCv8JWvjw5WAdeGfm1UNf7PoavEwHwYDVR0jBBgwFoAUpWpVTvQF6qq/
|
11
|
+
XnR6wLqe3OhV1q8wRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL2NlcnQtdmFsaWRh
|
12
|
+
dG9yLXRlc3QuaGVyb2t1YXBwLmNvbS9yZXZva2VkLmNybDBJBggrBgEFBQcBAQQ9
|
13
|
+
MDswOQYIKwYBBQUHMAGGLWh0dHA6Ly9jZXJ0LXZhbGlkYXRvci10ZXN0Lmhlcm9r
|
14
|
+
dWFwcC5jb20vb2NzcDANBgkqhkiG9w0BAQUFAANBABnK+JbR0Hzo509f4Qp450nI
|
15
|
+
L/aEO4PTUblLqNu3PaojWjGtq0wX/7UkoqL/yfq9OJAsjoea1+0BjFM+Rnemwmc=
|
16
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,13 @@
|
|
1
|
+
-----BEGIN X509 CRL-----
|
2
|
+
MIICBTCB7gIBATANBgkqhkiG9w0BAQUFADCBkDELMAkGA1UEBhMCVVMxEzARBgNV
|
3
|
+
BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxDjAMBgNVBAoMBUJhc2hv
|
4
|
+
MRswGQYDVQQLDBJSaWFrIFB5dGhvbiBDbGllbnQxCzAJBgNVBAMMAkNBMSAwHgYJ
|
5
|
+
KoZIhvcNAQkBFhFjbGllbnRzQGJhc2hvLmNvbRcNMTQwNTI3MTk0MjQ4WhcNMTQw
|
6
|
+
NjI2MTk0MjQ4WjAWMBQCA2beDRcNMTQwNTI3MTk0MjQ4WqARMA8wDQYDVR0UBAYC
|
7
|
+
BACikbwwDQYJKoZIhvcNAQEFBQADggEBAKPIogNgS8I4MR21ZrLkyV0wPGjzB26W
|
8
|
+
AplQMQqr8GYLLxkRPZBKDVdjwZINjmAm0MUsL74vnvrABJ91M0IRkanVPc3UA/Gk
|
9
|
+
ZNjH5WgTWbGP8SwdwPzjJeYckVQRNTpF9YQ/0XN1mtJA95WwSy7VuWKnMNRU0uf6
|
10
|
+
CWcXO+hlsPkwBTu+NMqkD2E5PpbcLvob9sdGMAJ2AzI2Oa8JPpVS9RXDFJTtqFAZ
|
11
|
+
JikU5MmZmpY9hL++3OD4rRih2lW32OzO710olJGPcV3o8Ax8KxPk13sVgdwTNPmj
|
12
|
+
auGtyqY/m/94SwNPUcglAkWn0wRO9sD+1PvoZJPxq+NBs/EKihFY1GI=
|
13
|
+
-----END X509 CRL-----
|
@@ -0,0 +1,15 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIICVDCCAf6gAwIBAgITBlDD3toc61D/0rrzeSlp/1NFvDANBgkqhkiG9w0BAQUF
|
3
|
+
ADBhMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHRmxvcmlkYTEOMAwGA1UEBwwFTWlh
|
4
|
+
bWkxHDAaBgNVBAoME3I1MDktY2VydC12YWxpZGF0b3IxEjAQBgNVBAMMCWxvY2Fs
|
5
|
+
aG9zdDAeFw0xNDA4MTgxNjMwNTNaFw0xNTA4MTgxNjMwNTNaMGExCzAJBgNVBAYT
|
6
|
+
AlVTMRAwDgYDVQQIDAdGbG9yaWRhMQ4wDAYDVQQHDAVNaWFtaTEcMBoGA1UECgwT
|
7
|
+
cjUwOS1jZXJ0LXZhbGlkYXRvcjESMBAGA1UEAwwJbG9jYWxob3N0MFwwDQYJKoZI
|
8
|
+
hvcNAQEBBQADSwAwSAJBAMTlPewWSsPlUG9idTsT2K2ORmFRPXX60ODDW0/2sjvE
|
9
|
+
hWcKdPccIGOSm95VtSL3+0DQMiC10uI4BBgGbXnJ4qcCAwEAAaOBjjCBizAdBgNV
|
10
|
+
HQ4EFgQUG5SeTrisYSI69NPcEAt2g+snrAMwHwYDVR0jBBgwFoAUpWpVTvQF6qq/
|
11
|
+
XnR6wLqe3OhV1q8wSQYIKwYBBQUHAQEEPTA7MDkGCCsGAQUFBzABhi1odHRwOi8v
|
12
|
+
Y2VydC12YWxpZGF0b3ItdGVzdC5oZXJva3VhcHAuY29tL29jc3AwDQYJKoZIhvcN
|
13
|
+
AQEFBQADQQAj3kdRTZ1Pk7AsOGsBrsxPzeCHtwEo/YL5bAW79uJTZGj2GCYd61uX
|
14
|
+
FMzUztX7cEkZW0LqXzPKO5pYg3bwHoGK
|
15
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,9 @@
|
|
1
|
+
-----BEGIN X509 CRL-----
|
2
|
+
MIIBQTCB7AIBATANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEQMA4GA1UE
|
3
|
+
CAwHRmxvcmlkYTEOMAwGA1UEBwwFTWlhbWkxHDAaBgNVBAoME3I1MDktY2VydC12
|
4
|
+
YWxpZGF0b3IxEjAQBgNVBAMMCWxvY2FsaG9zdBcNMTQwODE4MjEzMDUzWhcNMjQw
|
5
|
+
ODE1MjIzMDUzWjAmMCQCEwZQw97arFvKuvBO4bBLd8uNiyMXDTE0MDgxODIyMzA1
|
6
|
+
M1qgLzAtMAoGA1UdFAQDAgEBMB8GA1UdIwQYMBaAFKVqVU70Beqqv150esC6ntzo
|
7
|
+
VdavMA0GCSqGSIb3DQEBBQUAA0EALwWpIJPB2bBEnhG0/V9sawKcqip8jKWeiIuu
|
8
|
+
vTIYJSKZZb14mDbnfMxz4By6QnY0zV/6V7uoQtb2UqeYI9EWzg==
|
9
|
+
-----END X509 CRL-----
|
@@ -0,0 +1,16 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIICmzCCAkWgAwIBAgITBlDD3tqsW8q68E7hsEt3y42LIzANBgkqhkiG9w0BAQUF
|
3
|
+
ADBhMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHRmxvcmlkYTEOMAwGA1UEBwwFTWlh
|
4
|
+
bWkxHDAaBgNVBAoME3I1MDktY2VydC12YWxpZGF0b3IxEjAQBgNVBAMMCWxvY2Fs
|
5
|
+
aG9zdDAeFw0xNDA4MTgxNjMwNTNaFw0xNTA4MTgxNjMwNTNaMGExCzAJBgNVBAYT
|
6
|
+
AlVTMRAwDgYDVQQIDAdGbG9yaWRhMQ4wDAYDVQQHDAVNaWFtaTEcMBoGA1UECgwT
|
7
|
+
cjUwOS1jZXJ0LXZhbGlkYXRvcjESMBAGA1UEAwwJbG9jYWxob3N0MFwwDQYJKoZI
|
8
|
+
hvcNAQEBBQADSwAwSAJBALH+sXLe0yn6E7NIVSDaI0LTUSAoeNh73JgjsYo8enyv
|
9
|
+
uPfabwR94l/wuSDJZK6JCKUGhjg8AQuopcmyrrS6fVcCAwEAAaOB1TCB0jAdBgNV
|
10
|
+
HQ4EFgQUtbEyhfmU2TxYq1WUyA9C7fRHuBQwHwYDVR0jBBgwFoAUpWpVTvQF6qq/
|
11
|
+
XnR6wLqe3OhV1q8wRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL2NlcnQtdmFsaWRh
|
12
|
+
dG9yLXRlc3QuaGVyb2t1YXBwLmNvbS9yZXZva2VkLmNybDBJBggrBgEFBQcBAQQ9
|
13
|
+
MDswOQYIKwYBBQUHMAGGLWh0dHA6Ly9jZXJ0LXZhbGlkYXRvci10ZXN0Lmhlcm9r
|
14
|
+
dWFwcC5jb20vb2NzcDANBgkqhkiG9w0BAQUFAANBAKQdX9I+KAjFu2j0isy7HVJz
|
15
|
+
7KDrzawL6bh5no5WQkxVj5qiyW+htAWSSgw5ZVIg9tAQ1JVKvmduDkMqC9knXDk=
|
16
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,14 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIICGDCCAcKgAwIBAgITBlDD3tl93VE/AZAL1eO6oeRQkTANBgkqhkiG9w0BAQUF
|
3
|
+
ADBhMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHRmxvcmlkYTEOMAwGA1UEBwwFTWlh
|
4
|
+
bWkxHDAaBgNVBAoME3I1MDktY2VydC12YWxpZGF0b3IxEjAQBgNVBAMMCWxvY2Fs
|
5
|
+
aG9zdDAeFw0xNDA4MTgxNjMwNTNaFw0yNDA4MTUyMjMwNTNaMGExCzAJBgNVBAYT
|
6
|
+
AlVTMRAwDgYDVQQIDAdGbG9yaWRhMQ4wDAYDVQQHDAVNaWFtaTEcMBoGA1UECgwT
|
7
|
+
cjUwOS1jZXJ0LXZhbGlkYXRvcjESMBAGA1UEAwwJbG9jYWxob3N0MFwwDQYJKoZI
|
8
|
+
hvcNAQEBBQADSwAwSAJBAN8e7yWwTySejwwQj8LTbzcdRsHy0/q7lbg/+YuFIjvC
|
9
|
+
zPbMqVCNJA/ylvGs5iO6xRtPTZt0Nb3b/JnTxMx7jScCAwEAAaNTMFEwDwYDVR0T
|
10
|
+
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUpWpVTvQF6qq/XnR6wLqe3OhV1q8wHwYDVR0j
|
11
|
+
BBgwFoAUpWpVTvQF6qq/XnR6wLqe3OhV1q8wDQYJKoZIhvcNAQEFBQADQQCM2Wxj
|
12
|
+
7HHi6uZN5sBFczvDifdxryI+BotbRQqA07zgoa4PjPZGrT7oqhXd29UvNDE8bFTC
|
13
|
+
LzDB9a8J8ITkUSmQ
|
14
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,9 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIBOwIBAAJBAN8e7yWwTySejwwQj8LTbzcdRsHy0/q7lbg/+YuFIjvCzPbMqVCN
|
3
|
+
JA/ylvGs5iO6xRtPTZt0Nb3b/JnTxMx7jScCAwEAAQJBAJ8TSgO/6R09otVCNYz8
|
4
|
+
++z6hYkf3LyF41/i1MMBX3/ktM2LD3pB59ifyNPjix08XQPGVyZ51e18JBdIGYCA
|
5
|
+
4GkCIQD7Wx29cj7tgC7437E6zdNAvlEd9L5WvXPn+GRagBlgiwIhAOM+RPXBiK1z
|
6
|
+
Nz2wFa1smcaq8FSbb1yCet1NfhKHdF1VAiBTnS7ae2u1g+OcRIVnY1q3+ddwGJ9M
|
7
|
+
qX8qFnYDqQNIGwIgAe5sjZ4oeDjrdkXB2Wh74hlf04hCqQme27Sl5qhqD8UCIQCm
|
8
|
+
D9bqLg3O+PWgLXfKdOKIiRleQtiyb+b5f/JLy4vozw==
|
9
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
|
3
|
+
module Certs
|
4
|
+
def cert(name)
|
5
|
+
OpenSSL::X509::Certificate.new load "#{name}.crt"
|
6
|
+
end
|
7
|
+
|
8
|
+
def crl(name)
|
9
|
+
OpenSSL::X509::CRL.new load "#{name}.crl"
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def load(filename)
|
14
|
+
path = File.join(File.dirname(__FILE__), 'ca', filename)
|
15
|
+
File.read path
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: 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-08-19 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.6'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.0.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.0.0
|
55
|
+
description: Validate an X509 certificate against its listed OCSP endpoint and/or
|
56
|
+
a CRL.
|
57
|
+
email:
|
58
|
+
- bkerley@brycekerley.net
|
59
|
+
executables: []
|
60
|
+
extensions: []
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- ".gitignore"
|
64
|
+
- ".rspec"
|
65
|
+
- ".travis.yml"
|
66
|
+
- Gemfile
|
67
|
+
- LICENSE.txt
|
68
|
+
- README.md
|
69
|
+
- Rakefile
|
70
|
+
- cert_validator.gemspec
|
71
|
+
- lib/cert_validator.rb
|
72
|
+
- lib/cert_validator/asn1.rb
|
73
|
+
- lib/cert_validator/crl/extractor.rb
|
74
|
+
- lib/cert_validator/crl_validator.rb
|
75
|
+
- lib/cert_validator/errors.rb
|
76
|
+
- lib/cert_validator/ocsp.rb
|
77
|
+
- lib/cert_validator/ocsp/extractor.rb
|
78
|
+
- lib/cert_validator/ocsp/null_validator.rb
|
79
|
+
- lib/cert_validator/ocsp/real_validator.rb
|
80
|
+
- lib/cert_validator/version.rb
|
81
|
+
- lib/tasks/ca.rb
|
82
|
+
- lib/tasks/helper.rb
|
83
|
+
- spec/cert_validator_spec.rb
|
84
|
+
- spec/crl_extractor_spec.rb
|
85
|
+
- spec/crl_validator_spec.rb
|
86
|
+
- spec/null_ocsp_validator_spec.rb
|
87
|
+
- spec/ocsp_extractor_spec.rb
|
88
|
+
- spec/ocsp_validator_spec.rb
|
89
|
+
- spec/spec_helper.rb
|
90
|
+
- spec/support/ca/crl_only.crt
|
91
|
+
- spec/support/ca/digicert.crl
|
92
|
+
- spec/support/ca/empty.crt
|
93
|
+
- spec/support/ca/github.crt
|
94
|
+
- spec/support/ca/good.crt
|
95
|
+
- spec/support/ca/mismatched.crl
|
96
|
+
- spec/support/ca/ocsp_only.crt
|
97
|
+
- spec/support/ca/revoked.crl
|
98
|
+
- spec/support/ca/revoked.crt
|
99
|
+
- spec/support/ca/root.crt
|
100
|
+
- spec/support/ca/root.key
|
101
|
+
- spec/support/certs.rb
|
102
|
+
- spec/support/ocsp_guard.rb
|
103
|
+
- spec/support/validator_expectations.rb
|
104
|
+
homepage: ''
|
105
|
+
licenses:
|
106
|
+
- MIT
|
107
|
+
metadata: {}
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
requirements: []
|
123
|
+
rubyforge_project:
|
124
|
+
rubygems_version: 2.3.0
|
125
|
+
signing_key:
|
126
|
+
specification_version: 4
|
127
|
+
summary: Validate X509 certificates against CRL and OCSP.
|
128
|
+
test_files:
|
129
|
+
- spec/cert_validator_spec.rb
|
130
|
+
- spec/crl_extractor_spec.rb
|
131
|
+
- spec/crl_validator_spec.rb
|
132
|
+
- spec/null_ocsp_validator_spec.rb
|
133
|
+
- spec/ocsp_extractor_spec.rb
|
134
|
+
- spec/ocsp_validator_spec.rb
|
135
|
+
- spec/spec_helper.rb
|
136
|
+
- spec/support/ca/crl_only.crt
|
137
|
+
- spec/support/ca/digicert.crl
|
138
|
+
- spec/support/ca/empty.crt
|
139
|
+
- spec/support/ca/github.crt
|
140
|
+
- spec/support/ca/good.crt
|
141
|
+
- spec/support/ca/mismatched.crl
|
142
|
+
- spec/support/ca/ocsp_only.crt
|
143
|
+
- spec/support/ca/revoked.crl
|
144
|
+
- spec/support/ca/revoked.crt
|
145
|
+
- spec/support/ca/root.crt
|
146
|
+
- spec/support/ca/root.key
|
147
|
+
- spec/support/certs.rb
|
148
|
+
- spec/support/ocsp_guard.rb
|
149
|
+
- spec/support/validator_expectations.rb
|
150
|
+
has_rdoc:
|