easyrsa 0.8.0 → 0.8.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9ada5a7e2f566650ae8026337014a26b49edbdab
4
- data.tar.gz: 65e56567acfec259aaa97c4316ce120e6efeea02
3
+ metadata.gz: 3742312c40f8eb4d1d8764440fbbe194ceff36a9
4
+ data.tar.gz: f35d595436a145b81b1974019de0bdb1f57005dc
5
5
  SHA512:
6
- metadata.gz: 4f6cd1854b8cf83e0eff3b076949fc2749356b8f59c0be413cc29bc1ce376d685f66d6dff8333c126692f0ff7f1629d93d9b2cab68b1bca4bb525ed5813bc2d1
7
- data.tar.gz: 7a03dc59b07b8b892870f358c00f8a6f2732f04738e089e502f3ca73a816074c4ee991b16394c959d4863bfa0374292a320f84d5506b5d10c827cba364c7fa90
6
+ metadata.gz: 045c72d676fcad6d830008a7403494716bd650a65501664fb3985056bb804a058d427e409064697a43291e0a2d3051efcc57e9b622fee812bbb190344dc38164
7
+ data.tar.gz: c0d2824fa7b381b25fa5697b7e011856da91ff300ebce56195b5959431252a817d498ac0d6ed318525ce16b74b56aa93b39737c04c9e7150bf08a72adcbf618d
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # ruby-easyrsa
2
+ [![Build Status](https://travis-ci.org/mikemackintosh/ruby-easyrsa.svg)](https://travis-ci.org/mikemackintosh/ruby-easyrsa)
3
+
4
+ [![](http://ruby-gem-downloads-badge.herokuapp.com/easyrsa?type=total)](https://rubygems.org/gems/easyrsa)
5
+
6
+ [![Dependency Status](https://gemnasium.com/mikemackintosh/ruby-easyrsa.svg)](https://gemnasium.com/mikemackintosh/ruby-easyrsa)
7
+
8
+ [![Gem Version](https://badge.fury.io/rb/easyrsa.svg)](https://rubygems.org/gems/easyrsa)
9
+
10
+
11
+ Generate OpenVPN certificate and keys with Ruby using this gem.
12
+
13
+ ## Installation
14
+
15
+ Via command line use `gem`:
16
+
17
+ ```shell
18
+ gem install easyrsa
19
+ ```
20
+
21
+ or add it to your projects `Gemfile`:
22
+ ```ruby
23
+ gem 'easyrsa'
24
+ ```
25
+
26
+ and simply require it in your code:
27
+
28
+ ```ruby
29
+ require 'easyrsa'
30
+ ```
31
+
32
+ ## Usage
33
+
34
+ First, set your issuer configuration like so:
35
+
36
+ ```ruby
37
+ EasyRSA.configure do |issuer|
38
+ issuer.email = 'support@company.com'
39
+ issuer.server = 'vpnserver.company.com'
40
+ issuer.country = 'US'
41
+ issuer.city = 'New York'
42
+ issuer.company = 'My Company'
43
+ issuer.orgunit = 'IT'
44
+ end
45
+ ```
46
+
47
+ then use the `EasyRSA::Certificate` class to generate the certificate:
48
+
49
+ ```ruby
50
+ cn = 'Users Common Name'
51
+ email = 'users-common-name@company.com'
52
+ easyrsa = EasyRSA::Certificate.new(@ca_cert, @ca_key, cn, email)
53
+ g = easyrsa.generate
54
+ #=> [:key => '...RSA KEY...', :crt => '...CERTIFICATE...']
55
+ ```
56
+
57
+ >**Note** `ca_cert` and `ca_key` should point to the same certificate and keys that are included in your OpenVPN configuration file.
58
+
59
+ ## Generate the CA files
60
+
61
+ The following can be used to create a Certificate Authority:
62
+
63
+ ```ruby
64
+ ca = EasyRSA::CA.new('CN=openvpn/DC=example/DC=com')
65
+ g = ca.generate
66
+ #=> [:key => '...RSA KEY...', :crt => '...CERTIFICATE...']
67
+ ```
data/easyrsa.gemspec CHANGED
@@ -25,10 +25,11 @@ Gem::Specification.new do |s|
25
25
 
26
26
  s.add_dependency 'openssl'
27
27
  s.add_dependency 'fattr'
28
+ s.add_dependency 'paint'
29
+ s.add_dependency 'methadone'
28
30
 
29
31
  s.add_development_dependency "bundler"
30
32
  s.add_development_dependency "rake"
31
33
  s.add_development_dependency "rspec"
32
- s.add_development_dependency "webmock"
33
34
 
34
35
  end
data/lib/easyrsa.rb CHANGED
@@ -4,11 +4,16 @@ require 'fattr'
4
4
  require 'easyrsa/version'
5
5
  require 'easyrsa/config'
6
6
  require 'easyrsa/certificate'
7
+ require 'easyrsa/ca'
8
+ require 'easyrsa/cli'
9
+ #require 'easyrsa/revoke'
7
10
 
8
11
  module EasyRSA
9
12
 
13
+ # Extend Self
10
14
  extend self
11
15
 
16
+ # The Configure Block
12
17
  def configure
13
18
  block_given? ? yield(Config) : Config
14
19
  %w(email server country city company orgunit).each do |key|
@@ -21,4 +26,9 @@ module EasyRSA
21
26
  end
22
27
  alias_method :config, :configure
23
28
 
29
+ # Helper for years from now
30
+ def years_from_now(i = 10)
31
+ Time.now + i * 365 * 24 * 60 * 60
32
+ end
33
+
24
34
  end
data/lib/easyrsa/ca.rb ADDED
@@ -0,0 +1,96 @@
1
+ module EasyRSA
2
+ class CA
3
+
4
+ class BitLengthToWeak < RuntimeError; end
5
+ class InvalidCAName < RuntimeError; end
6
+ class MissingParameter < RuntimeError; end
7
+
8
+ def initialize(ca_name=nil, bits=4096, &block)
9
+
10
+ # CA Name to generate cert for
11
+ begin
12
+ if ca_name.eql? nil
13
+ raise EasyRSA::CA::MissingParameter,
14
+ "Please provide a 'ca name', for the certificates' CN field. This should be in the format, 'CN=ca/DC=example/DC=com' for 'ca.example.com'"
15
+ end
16
+ @ca_name = OpenSSL::X509::Name.parse ca_name
17
+ rescue TypeError => e
18
+ fail EasyRSA::CA::InvalidCAName,
19
+ "Please provide a 'ca name', for the certificates' CN field. This should be in the format, 'CN=ca/DC=example/DC=com' for 'ca.example.com'"
20
+ end
21
+
22
+ # Generate Private Key
23
+ if bits < 2048
24
+ raise EasyRSA::CA::BitLengthToWeak,
25
+ "Please select a bit length greater than 2048. Default is 4096. You chose '#{bits}'"
26
+ end
27
+ @ca_key = OpenSSL::PKey::RSA.new(bits)
28
+
29
+ # Instantiate a new certificate
30
+ @ca_cert = OpenSSL::X509::Certificate.new
31
+
32
+ # This cert should never be valid before now
33
+ @ca_cert.not_before = Time.now
34
+
35
+ # Set it to version
36
+ @ca_cert.version = 2
37
+
38
+ # Generate and assign the serial
39
+ @ca_cert.serial = 0
40
+
41
+ instance_eval(&block) if block_given?
42
+ end
43
+
44
+ def generate(validfor=10)
45
+
46
+ # Set the expiration date
47
+ @ca_cert.not_after = EasyRSA::years_from_now(validfor)
48
+
49
+ # Add the public key
50
+ @ca_cert.public_key = @ca_key.public_key
51
+
52
+ # Set the CA Cert Subject
53
+ @ca_cert.subject = @ca_name
54
+
55
+ # Set the CA Cert Subject
56
+ gen_issuer
57
+
58
+ # Add extensions
59
+ add_extensions
60
+
61
+ # Sign the cert
62
+ sign_cert
63
+
64
+ { key: @ca_key.to_pem, crt: @ca_cert.to_pem }
65
+
66
+ end
67
+
68
+ private
69
+
70
+ # Cert issuer details
71
+ def gen_issuer
72
+ @ca_cert.issuer = OpenSSL::X509::Name.parse("/C=#{EasyRSA::Config.country}/" \
73
+ "L=#{EasyRSA::Config.city}/O=#{EasyRSA::Config.company}/OU=#{EasyRSA::Config.orgunit}/" \
74
+ "CN=#{EasyRSA::Config.server}/name=#{EasyRSA::Config.orgunit}/" \
75
+ "emailAddress=#{EasyRSA::Config.email}")
76
+ end
77
+
78
+ # Add Extensions needed
79
+ def add_extensions
80
+ ef = OpenSSL::X509::ExtensionFactory.new
81
+ ef.subject_certificate = @ca_cert
82
+ ef.issuer_certificate = @ca_cert
83
+
84
+ @ca_cert.add_extension ef.create_extension('subjectKeyIdentifier', 'hash')
85
+ @ca_cert.add_extension ef.create_extension('basicConstraints', 'CA:TRUE', true)
86
+ @ca_cert.add_extension ef.create_extension('keyUsage', 'cRLSign,keyCertSign', true)
87
+
88
+ end
89
+
90
+ # Sign cert with CA key
91
+ def sign_cert
92
+ @ca_cert.sign @ca_key, OpenSSL::Digest::SHA256.new
93
+ end
94
+
95
+ end
96
+ end
@@ -60,7 +60,7 @@ module EasyRSA
60
60
  def generate(validfor=10)
61
61
 
62
62
  # Set the expiration date
63
- @cert.not_after = years_from_now(validfor)
63
+ @cert.not_after = EasyRSA::years_from_now(validfor)
64
64
 
65
65
  # Add the public key
66
66
  @cert.public_key = @key.public_key
@@ -124,10 +124,6 @@ module EasyRSA
124
124
  "#{Time.now.strftime("%Y%m%d%H%M%S")}#{@id.unpack('c*').join.to_i}".to_i
125
125
  end
126
126
 
127
- def years_from_now(i = 10)
128
- Time.now + i * 365 * 24 * 60 * 60
129
- end
130
-
131
127
  def sign_cert_with_ca
132
128
  @cert.sign @ca_key, OpenSSL::Digest::SHA256.new
133
129
  end
@@ -1,3 +1,3 @@
1
1
  module EasyRSA
2
- VERSION = '0.8.0'
2
+ VERSION = '0.8.5'
3
3
  end
@@ -38,7 +38,7 @@ describe EasyRSA::Certificate, 'Should' do
38
38
 
39
39
  end
40
40
 
41
- it 'throw error when invalid ca key is passed' do
41
+ it 'throw error when bit length is too weak' do
42
42
 
43
43
  expect {
44
44
  EasyRSA::Certificate.new(@ca_cert, @ca_key, 'blah', 'blah@blah', 512)
@@ -0,0 +1,63 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe EasyRSA::CA, 'Should' do
4
+ include_context "shared environment"
5
+
6
+ before do
7
+ EasyRSA.configure do |issuer|
8
+ issuer.email = @email
9
+ issuer.server = @server
10
+ issuer.country = @country
11
+ issuer.city = @city
12
+ issuer.company = @company
13
+ issuer.orgunit = @orgunit
14
+ end
15
+ end
16
+
17
+ it 'throw error when arguments are missing' do
18
+ expect {
19
+ EasyRSA::CA.new
20
+ }.to raise_error(EasyRSA::CA::MissingParameter)
21
+ end
22
+
23
+ it 'throw error when invalid ca key is passed' do
24
+
25
+ expect {
26
+ EasyRSA::CA.new('sadfsdf')
27
+ }.to raise_error(EasyRSA::CA::InvalidCAName)
28
+
29
+ end
30
+
31
+ it 'throw error when bit length is too weak' do
32
+
33
+ expect {
34
+ EasyRSA::CA.new("CN=ca/DC=example", 512)
35
+ }.to raise_error(EasyRSA::CA::BitLengthToWeak)
36
+
37
+ end
38
+
39
+ it 'return keys successfully' do
40
+
41
+ easyrsa = EasyRSA::CA.new("CN=ca/DC=example")
42
+ g = easyrsa.generate
43
+
44
+ expect(g[:key]).to include('BEGIN RSA PRIVATE KEY')
45
+ expect(g[:crt]).to include('BEGIN CERTIFICATE')
46
+
47
+ end
48
+
49
+
50
+ it 'return successful in a block as well' do
51
+ g = {}
52
+ EasyRSA::CA.new("CN=ca/DC=example") do |c|
53
+ c.generate.each do |k, v|
54
+ g[k] = v
55
+ end
56
+ end
57
+
58
+ expect(g[:key]).to include('BEGIN RSA PRIVATE KEY')
59
+ expect(g[:crt]).to include('BEGIN CERTIFICATE')
60
+
61
+ end
62
+
63
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easyrsa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Mackintosh
@@ -14,84 +14,98 @@ dependencies:
14
14
  name: openssl
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: fattr
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: paint
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
- type: :development
48
+ type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake
56
+ name: methadone
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
75
  version: '0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - '>='
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rspec
84
+ name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - '>='
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
89
  version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - '>='
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: webmock
98
+ name: rspec
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - '>='
101
+ - - ">="
88
102
  - !ruby/object:Gem::Version
89
103
  version: '0'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - '>='
108
+ - - ">="
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  description: Easily generate OpenVPN certificates without needing the easyrsa packaged
@@ -101,13 +115,15 @@ executables: []
101
115
  extensions: []
102
116
  extra_rdoc_files: []
103
117
  files:
104
- - .gitignore
105
- - .rock.yml
118
+ - ".gitignore"
119
+ - ".rock.yml"
106
120
  - Gemfile
107
121
  - LICENSE.txt
122
+ - README.md
108
123
  - Rakefile
109
124
  - easyrsa.gemspec
110
125
  - lib/easyrsa.rb
126
+ - lib/easyrsa/ca.rb
111
127
  - lib/easyrsa/certificate.rb
112
128
  - lib/easyrsa/config.rb
113
129
  - lib/easyrsa/version.rb
@@ -115,6 +131,7 @@ files:
115
131
  - spec/cakey.pem
116
132
  - spec/easyrsa/01_config_spec.rb
117
133
  - spec/easyrsa/02_certificate_spec.rb
134
+ - spec/easyrsa/03_ca_spec.rb
118
135
  - spec/spec_helper.rb
119
136
  homepage: http://github.com/mikemackintosh/ruby-easyrsa
120
137
  licenses:
@@ -126,17 +143,17 @@ require_paths:
126
143
  - lib
127
144
  required_ruby_version: !ruby/object:Gem::Requirement
128
145
  requirements:
129
- - - '>='
146
+ - - ">="
130
147
  - !ruby/object:Gem::Version
131
148
  version: '0'
132
149
  required_rubygems_version: !ruby/object:Gem::Requirement
133
150
  requirements:
134
- - - '>='
151
+ - - ">="
135
152
  - !ruby/object:Gem::Version
136
153
  version: '0'
137
154
  requirements: []
138
155
  rubyforge_project:
139
- rubygems_version: 2.0.14
156
+ rubygems_version: 2.2.2
140
157
  signing_key:
141
158
  specification_version: 4
142
159
  summary: EasyRSA interface for generating OpenVPN certificates
@@ -145,4 +162,5 @@ test_files:
145
162
  - spec/cakey.pem
146
163
  - spec/easyrsa/01_config_spec.rb
147
164
  - spec/easyrsa/02_certificate_spec.rb
165
+ - spec/easyrsa/03_ca_spec.rb
148
166
  - spec/spec_helper.rb