r509-middleware-certwriter 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,26 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEVTCCAz2gAwIBAgIQK5l6hFau2oVFyjrq4Y3tYjANBgkqhkiG9w0BAQUFADBI
3
+ MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
4
+ FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTExMDIxNzAxMDkxM1oXDTExMDIx
5
+ ODAyMzYyNVowXDESMBAGA1UEAxMJbGFuZ3VpLnNoMRAwDgYDVQQHEwdDaGljYWdv
6
+ MREwDwYDVQQIEwhJbGxpbm9pczELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1BhdWwg
7
+ S2VocmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3/vt5cvm4ObA
8
+ AUoKXqjT9hWbN7c//piYtypGCvUWPqXElIWSpftMfmyIyujXGVx1TtpjSTX1VORB
9
+ J1N4ZmGsEnyS5Z4jw6kFtKBEA6avIezYfAwUU+GKL5xvJ2iuwPgVzrDwADD1lSio
10
+ worMdqeZMfClVBbeLPE1ZZQrj1YV4ywpfEUVNNkmYLxetT8WyGFmFopiQWv21v0u
11
+ BWfWa1c8wQMrLNSzDot76+CgqC/j9AFcfv75M77WktDlz8zFm142UUe0Clx3DzlO
12
+ k+OepGYLUhRZaGhiP56qW2kgQpeQ+Otiu7NrJP1oa6lP1inzr25aStWtt9+0uJAJ
13
+ LvHisvPV7QIDAQABo4IBJTCCASEwCQYDVR0TBAIwADAdBgNVHQ4EFgQUOnG63iFQ
14
+ miWaAnvO7ve38SmF2FEwHwYDVR0jBBgwFoAUQjK2FvoE/f5dS3rD/fdMQB1aQ68w
15
+ CwYDVR0PBAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMDQGA1UdHwQtMCswKaAn
16
+ oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NUQ0EuY3JsMEQGA1UdIAQ9
17
+ MDswOQYMYIZIAYb9ZAEBAgMBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly9zc2wudHJ1
18
+ c3R3YXZlLmNvbS9DQTA2BgNVHREELzAtgglsYW5ndWkuc2iCC3ZpY3RvbHkuY29t
19
+ ghNteXRlYW1nb3Ryb2JiZWQuY29tMA0GCSqGSIb3DQEBBQUAA4IBAQB8t6JEw494
20
+ wMHyPN8K65PmImqdI4qL5W4T141vG+SnynSsyF2gdnwfWC8esoVOBK8LxSxq5dqL
21
+ 7DRWwJww5YELWhVGz9BMGqpsUQ8ea1EX2YRkguqhIs9Ox/D0zcE5T0t4CXAoqJoW
22
+ h1A3UBknOgHNtxbBcQUINITj+IIQ99yZdf/X5QnuyRxk+FheUtuR/PGSHi5s0GOh
23
+ aEysvcklQTZXaQ+yeq5mH9LrKlBaEgo2BWnzWuWbudNJ3Pn16MHE4hGesiO/ifu4
24
+ D4ZcDusOOKJISgellMBwEX9njm771lzcVrXrg8IxBwHAmbA5SlTd12DOhrViPuEC
25
+ DhMwdOfwCNq/
26
+ -----END CERTIFICATE-----
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDcTCCAlmgAwIBAgIVAOwRcCniDRHmYonGNci2hn7WEUjbMA0GCSqGSIb3DQEB
3
+ BQUAMFgxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhJbGxpbm9pczEQMA4GA1UEBwwH
4
+ Q2hpY2FnbzERMA8GA1UECgwIcjUwOSBMTEMxETAPBgNVBAMMCMO8dGYuY29tMB4X
5
+ DTEyMDczMTA5NTk0OFoXDTEyMDgwNTE1NTk0OFowWDELMAkGA1UEBhMCVVMxETAP
6
+ BgNVBAgMCElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMREwDwYDVQQKDAhyNTA5
7
+ IExMQzERMA8GA1UEAwwIw7x0Zi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
8
+ ggEKAoIBAQCcM1YlpONMNoK+VZRe/fygehtQoNhc/NEvpD4g9z61jY9JrRAiS/sj
9
+ FqVYUyJIoQ8x2tpiJMqzTfdTXVbXdVi6iuDYGg6oiski3N8wa8Ya2FWEWS0nCdiM
10
+ AYCX5imyHY9qJqRCGo8mzFjdPQ1YL5qEIN8a7to82F81P9D+AWaPeXgvR/AuWNXo
11
+ ZTTWDxf2hHhBI00lMkQYk/JP//jq4vhArnvhP/NjQRMPv+Oc7/oKG0dPGp8IMVt0
12
+ B+Gus/Lte6GFqSt3A4j3JslUR7s5tZMvNoYCHTp70n3So28U7zSFjqtLZ0qYdMnw
13
+ +ysrVeemz4iUBjLFDuUoUFETLJCZxN4HAgMBAAGjMjAwMA8GA1UdEwEB/wQFMAMB
14
+ Af8wHQYDVR0OBBYEFIZITcrz5duBFkyK1USyvJn6dBh2MA0GCSqGSIb3DQEBBQUA
15
+ A4IBAQCFzmlRVaLjzo3CzETtNcg3rqItIugXX1xtVBYdmXE+OZu54zEUCKRphave
16
+ 4j/fjx7UVRlZJfkpxw77bXcOt+pgAuKogVv8b0jNVLI/IJSqpdLYRmNBmO/z5Tsn
17
+ bJ2anRLxYABxx3QiyxbteJ5kNyqkOXdC92YT0ajYcsI1PYr5bC+yc4oju3dkVHox
18
+ 6nbghWIZxbLq08DO3FwbTZk7OOERFYakntaEV7A9HI75pct9fR03lej86wthLCva
19
+ bf4jZw6fbLZTMK8AIGm0dSlkNWzN7XB6xDyxxYoCauZc+TBoZg4hXAzwfgZcX3Rr
20
+ MHJh+Ni/iMiCFSZPcZqauprdCldD
21
+ -----END CERTIFICATE-----
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDpzCCAo+gAwIBAgIFMUeGsoAwDQYJKoZIhvcNAQEFBQAwSDELMAkGA1UEBhMC
3
+ VVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5T
4
+ ZWN1cmVUcnVzdCBDQTAeFw0wOTA1MjkyMDM0NTdaFw0xMDA1MjkyMDM0NTdaMHcx
5
+ CzAJBgNVBAYTAlVTMREwDwYDVQQIEwhJbGxpbm9pczEQMA4GA1UEBxMHQ2hpY2Fn
6
+ bzEtMCsGA1UEChMkVHJ1c3R3YXZlIChUcnVzdHdhdmUgSG9sZGluZ3MsIEluYy4p
7
+ MRQwEgYDVQQDFAsqLnhyYW1wLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
8
+ gYEA16PhTcHPpJcvXj0sO+hYt4z2zKn5XRj0jrDpwzahxUWn0UWfsYxJHtOpSm/p
9
+ O8zM3aCv5YI+0DwVWhzkKzh15nL5XtiyhXz2CSg4IskVqYlHJwLN1TasYpiQ3chj
10
+ 0v33GGXg0JjCdX5XM8fl2K/MCHpl6HTNmxHVpr4sghyUBFUCAwEAAaOB7DCB6TAJ
11
+ BgNVHRMEAjAAMB0GA1UdDgQWBBSGo0yuScr4ea0rLYwuTnN/mmD5aDAfBgNVHSME
12
+ GDAWgBRCMrYW+gT9/l1LesP990xAHVpDrzALBgNVHQ8EBAMCBaAwEwYDVR0lBAww
13
+ CgYIKwYBBQUHAwEwNAYDVR0fBC0wKzApoCegJYYjaHR0cDovL2NybC5zZWN1cmV0
14
+ cnVzdC5jb20vU1RDQS5jcmwwRAYDVR0gBD0wOzA5BgxghkgBhv1kAQECAwEwKTAn
15
+ BggrBgEFBQcCARYbaHR0cDovL3NzbC50cnVzdHdhdmUuY29tL0NBMA0GCSqGSIb3
16
+ DQEBBQUAA4IBAQBxuF3OJYj4e/4flpn2xRB5HTZtdTJGa0xdhs4cuZfDaH1J26kS
17
+ D/DEJSjQijxMmRCkBFzjqet095Nxo/Gk4Ak+A6I49vWfg4EYEGfCHq95D40EoLUl
18
+ +P4n4SqGUWuHCdVue8V61qGhMv4t4aqaodO212oykfkwguX1t1QAqBisBd3trUJC
19
+ nqeHRdhPQfwSXbEgwPCnvS6QAngwg1BRCK5NJ2V2ybhaSHZLSzTV+n2sh03j2OAw
20
+ DX1jPcls0lN9TytLZJUkZJjgr/v2yYUlwEGC6ZMHE16ycVAbTxW94LBYKlsCpR3Q
21
+ kArWrEDOOBl5g0Va/FZliL046AN3EM2lYfWa
22
+ -----END CERTIFICATE-----
@@ -0,0 +1,188 @@
1
+ # coding: utf-8
2
+ require "#{File.dirname(__FILE__)}/spec_helper"
3
+ require "sinatra"
4
+ require "logger"
5
+ require "fileutils"
6
+
7
+ class TestServer < Sinatra::Base
8
+ configure do
9
+ set :config_pool, nil
10
+ end
11
+
12
+ error StandardError do
13
+ env["sinatra.error"].message
14
+ end
15
+
16
+ get "/some/path/?" do
17
+ "return value"
18
+ end
19
+
20
+ post "/1/certificate/issue/?" do
21
+ if params["successful"]
22
+ if params["cert"]
23
+ params["cert"]
24
+ else
25
+ TestFixtures::CERT
26
+ end
27
+ elsif params["invalid_body"]
28
+ "invalid cert body"
29
+ else
30
+ raise StandardError.new("Error")
31
+ end
32
+ end
33
+
34
+ post "/1/certificate/revoke/?" do
35
+ if params["successful"]
36
+ "CRL"
37
+ else
38
+ raise StandardError.new("Error")
39
+ end
40
+ end
41
+
42
+ post "/1/certificate/unrevoke/?" do
43
+ if params["successful"]
44
+ "CRL"
45
+ else
46
+ raise StandardError.new("Error")
47
+ end
48
+ end
49
+ end
50
+
51
+ describe R509::Middleware::Certwriter do
52
+ before :all do
53
+ @temp_write_directory = File.join("spec", "temp_write_directory")
54
+ FileUtils.makedirs(@temp_write_directory)
55
+ end
56
+ before :each do
57
+ @logger = double("logger")
58
+ @config = double("config")
59
+ @ca_cert = double("ca_cert")
60
+ @config_pool = double("config_pool")
61
+ Dependo::Registry[:log] = @logger
62
+ end
63
+ after :each do
64
+ Dir.entries(@temp_write_directory).select{|x| not x.start_with?(".")}.each do |entry|
65
+ File.delete(File.join(@temp_write_directory, entry))
66
+ end
67
+ end
68
+ after :all do
69
+ Dir.delete(@temp_write_directory)
70
+ end
71
+
72
+ def app
73
+ test_server = TestServer
74
+ test_server.send(:set, :config_pool, @config_pool)
75
+
76
+ @app ||= R509::Middleware::Certwriter.new(test_server, @config)
77
+ end
78
+
79
+ context "some path" do
80
+ it "returns some return value" do
81
+ get "/some/path"
82
+ last_response.body.should == "return value"
83
+ end
84
+ end
85
+
86
+ context "issuing" do
87
+ it "intercepts issuance" do
88
+ filename = "langui.sh_testy_211653423715.pem"
89
+ @config.should_receive(:[]).with("certwriter").and_return({"path"=>@temp_write_directory})
90
+ @logger.should_receive(:info).with("Writing: #{File.join(@temp_write_directory, filename)}")
91
+
92
+ post "/1/certificate/issue", :successful => true, :ca => "testy"
93
+ last_response.status.should == 200
94
+ last_response.body.should == TestFixtures::CERT
95
+
96
+ File.read(File.join(@temp_write_directory, filename)).should == TestFixtures::CERT
97
+ end
98
+ it "no certwriter" do
99
+ filename = "langui.sh_testy_211653423715.pem"
100
+ @config.should_receive(:[]).with("certwriter").and_return(nil)
101
+ @logger.should_receive(:error).twice
102
+
103
+ post "/1/certificate/issue", :successful => true, :ca => "testy"
104
+ last_response.status.should == 200
105
+ last_response.body.should == TestFixtures::CERT
106
+
107
+ File.exist?(File.join(@temp_write_directory, filename)).should == false
108
+ end
109
+ it "no certwriter path" do
110
+ filename = "langui.sh_testy_211653423715.pem"
111
+ @config.should_receive(:[]).with("certwriter").and_return({})
112
+ @logger.should_receive(:error).twice
113
+
114
+ post "/1/certificate/issue", :successful => true, :ca => "testy"
115
+ last_response.status.should == 200
116
+ last_response.body.should == TestFixtures::CERT
117
+
118
+ File.exist?(File.join(@temp_write_directory, filename)).should == false
119
+ end
120
+ it "fails issuance" do
121
+ post "/1/certificate/issue/"
122
+ last_response.status.should == 500
123
+ end
124
+ it "invalid cert body" do
125
+ @logger.should_receive(:error).twice
126
+ post "/1/certificate/issue", :invalid_body => true
127
+ last_response.status.should == 200
128
+ last_response.body.should == "invalid cert body"
129
+ end
130
+ it "wildcard" do
131
+ filename = "STAR.xramp.com_testy_211653407360.pem"
132
+ @config.should_receive(:[]).with("certwriter").and_return({"path"=>@temp_write_directory})
133
+ @logger.should_receive(:info).with("Writing: #{File.join(@temp_write_directory, filename)}")
134
+
135
+ post "/1/certificate/issue", :successful => true, :cert => TestFixtures::WILDCARD, :ca => "testy"
136
+ last_response.status.should == 200
137
+ last_response.body.should == TestFixtures::WILDCARD
138
+
139
+ File.read(File.join(@temp_write_directory, filename)).should == TestFixtures::WILDCARD.chomp
140
+ end
141
+ it "san" do
142
+ filename = "langui.sh_testy_57953710177023404420300898930034339170.pem"
143
+ @config.should_receive(:[]).with("certwriter").and_return({"path"=>@temp_write_directory})
144
+ @logger.should_receive(:info).with("Writing: #{File.join(@temp_write_directory, filename)}")
145
+
146
+ post "/1/certificate/issue", :successful => true, :cert => TestFixtures::SAN, :ca => "testy"
147
+ last_response.status.should == 200
148
+ last_response.body.should == TestFixtures::SAN
149
+
150
+ File.read(File.join(@temp_write_directory, filename)).should == TestFixtures::SAN.chomp
151
+ end
152
+ it "non-ascii characters" do
153
+ filename = "tf.com_testy_1347710705410875939179018156461170725106572413147.pem"
154
+ @config.should_receive(:[]).with("certwriter").and_return({"path"=>@temp_write_directory})
155
+ @logger.should_receive(:info).with("Writing: #{File.join(@temp_write_directory, filename)}")
156
+
157
+ post "/1/certificate/issue", :successful => true, :cert => TestFixtures::UTF, :ca => "testy"
158
+ last_response.status.should == 200
159
+ last_response.body.should == TestFixtures::UTF
160
+
161
+ File.read(File.join(@temp_write_directory, filename)).should == TestFixtures::UTF.chomp
162
+ end
163
+ end
164
+
165
+ context "revoking" do
166
+ it "intercepts revoke" do
167
+ post "/1/certificate/revoke", :successful => true, :serial => 1234, :ca => "some_ca"
168
+ last_response.status.should == 200
169
+ last_response.body.should == "CRL"
170
+ end
171
+ it "fails to revoke" do
172
+ post "/1/certificate/revoke"
173
+ last_response.status.should == 500
174
+ end
175
+ end
176
+
177
+ context "unrevoking" do
178
+ it "intercepts unrevoke" do
179
+ post "/1/certificate/unrevoke", :successful => true, :serial => 1234, :ca => "some_ca"
180
+ last_response.status.should == 200
181
+ last_response.body.should == "CRL"
182
+ end
183
+ it "fails to unrevoke" do
184
+ post "/1/certificate/unrevoke"
185
+ last_response.status.should == 500
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,16 @@
1
+ if (RUBY_VERSION.split('.')[1].to_i > 8)
2
+ require 'simplecov'
3
+ SimpleCov.start
4
+ end
5
+
6
+ $:.unshift File.expand_path("../../lib", __FILE__)
7
+ $:.unshift File.expand_path("../", __FILE__)
8
+ require 'rubygems'
9
+ require 'fixtures'
10
+ require 'rspec'
11
+ require 'rack/test'
12
+ require 'r509/middleware/certwriter'
13
+
14
+ RSpec.configure do |conf|
15
+ conf.include Rack::Test::Methods
16
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: r509-middleware-certwriter
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sean Schulte
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-08 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sinatra
16
+ requirement: &2154591280 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2154591280
25
+ - !ruby/object:Gem::Dependency
26
+ name: rack
27
+ requirement: &2154590760 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2154590760
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &2154590240 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2154590240
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &2154589800 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2154589800
58
+ - !ruby/object:Gem::Dependency
59
+ name: rack-test
60
+ requirement: &2154589280 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *2154589280
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: &2154604540 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2154604540
80
+ description: Rack middleware that writes issued certificates to disk
81
+ email: sirsean@gmail.com
82
+ executables: []
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - README.md
87
+ - Rakefile
88
+ - lib/r509/middleware/certwriter/version.rb
89
+ - lib/r509/middleware/certwriter.rb
90
+ - spec/fixtures/cert1.pem
91
+ - spec/fixtures/san.pem
92
+ - spec/fixtures/utf.pem
93
+ - spec/fixtures/wildcard.pem
94
+ - spec/fixtures.rb
95
+ - spec/middleware_spec.rb
96
+ - spec/spec_helper.rb
97
+ - doc/_index.html
98
+ - doc/class_list.html
99
+ - doc/css/common.css
100
+ - doc/css/full_list.css
101
+ - doc/css/style.css
102
+ - doc/file.README.html
103
+ - doc/file_list.html
104
+ - doc/frames.html
105
+ - doc/index.html
106
+ - doc/js/app.js
107
+ - doc/js/full_list.js
108
+ - doc/js/jquery.js
109
+ - doc/method_list.html
110
+ - doc/R509/Middleware/Certwriter.html
111
+ - doc/R509/Middleware.html
112
+ - doc/R509.html
113
+ - doc/top-level-namespace.html
114
+ homepage: http://vikinghammer.com
115
+ licenses: []
116
+ post_install_message:
117
+ rdoc_options: []
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: 1.8.6
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ segments:
133
+ - 0
134
+ hash: -1561366354408036506
135
+ requirements: []
136
+ rubyforge_project:
137
+ rubygems_version: 1.8.10
138
+ signing_key:
139
+ specification_version: 3
140
+ summary: Rack middleware that writes issued certificates to disk
141
+ test_files: []
142
+ has_rdoc: false