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.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +4 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +55 -0
  8. data/Rakefile +6 -0
  9. data/cert_validator.gemspec +24 -0
  10. data/lib/cert_validator.rb +40 -0
  11. data/lib/cert_validator/asn1.rb +15 -0
  12. data/lib/cert_validator/crl/extractor.rb +48 -0
  13. data/lib/cert_validator/crl_validator.rb +93 -0
  14. data/lib/cert_validator/errors.rb +81 -0
  15. data/lib/cert_validator/ocsp.rb +13 -0
  16. data/lib/cert_validator/ocsp/extractor.rb +52 -0
  17. data/lib/cert_validator/ocsp/null_validator.rb +17 -0
  18. data/lib/cert_validator/ocsp/real_validator.rb +117 -0
  19. data/lib/cert_validator/version.rb +3 -0
  20. data/lib/tasks/ca.rb +112 -0
  21. data/lib/tasks/helper.rb +36 -0
  22. data/spec/cert_validator_spec.rb +73 -0
  23. data/spec/crl_extractor_spec.rb +42 -0
  24. data/spec/crl_validator_spec.rb +59 -0
  25. data/spec/null_ocsp_validator_spec.rb +19 -0
  26. data/spec/ocsp_extractor_spec.rb +31 -0
  27. data/spec/ocsp_validator_spec.rb +34 -0
  28. data/spec/spec_helper.rb +15 -0
  29. data/spec/support/ca/crl_only.crt +15 -0
  30. data/spec/support/ca/digicert.crl +0 -0
  31. data/spec/support/ca/empty.crt +13 -0
  32. data/spec/support/ca/github.crt +34 -0
  33. data/spec/support/ca/good.crt +16 -0
  34. data/spec/support/ca/mismatched.crl +13 -0
  35. data/spec/support/ca/ocsp_only.crt +15 -0
  36. data/spec/support/ca/revoked.crl +9 -0
  37. data/spec/support/ca/revoked.crt +16 -0
  38. data/spec/support/ca/root.crt +14 -0
  39. data/spec/support/ca/root.key +9 -0
  40. data/spec/support/certs.rb +17 -0
  41. data/spec/support/ocsp_guard.rb +2 -0
  42. data/spec/support/validator_expectations.rb +13 -0
  43. 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
@@ -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-----
@@ -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
@@ -0,0 +1,2 @@
1
+ module OcspGuard
2
+ end
@@ -0,0 +1,13 @@
1
+ module ValidatorExpectations
2
+ RSpec::Matchers.define :be_available do
3
+ match do |actual|
4
+ actual.available?
5
+ end
6
+ end
7
+
8
+ RSpec::Matchers.define :be_valid do
9
+ match do |actual|
10
+ actual.valid?
11
+ end
12
+ end
13
+ 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: