rails-letsencrypt 0.1.0 → 0.2.0
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 +4 -4
- data/README.md +65 -12
- data/app/models/lets_encrypt/certificate.rb +9 -0
- data/lib/letsencrypt.rb +48 -37
- data/lib/letsencrypt/configuration.rb +18 -0
- data/lib/letsencrypt/redis.rb +16 -0
- data/lib/letsencrypt/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10abe713ee77d4fa73de337089261b1981783ad0
|
4
|
+
data.tar.gz: 528f836581b20b4bb845c67a80386d413ef80801
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e99ac7b4301fed05b62fc9a77143c0c4efcdcaa76d98fb74e19f3e7f9fc3fb18f8a79ee433a6a0ee1c67e5d527966da1433fe8a3e345ce24bce5978209e596cf
|
7
|
+
data.tar.gz: 871b718b910992f3484f0a389b7bb9456cfb26532b79920f213a72e5637ae74794562ca643a4834262f164bd75b2265e8bcdcb63c54812241176d4b3af06cdc5
|
data/README.md
CHANGED
@@ -1,28 +1,81 @@
|
|
1
1
|
# LetsEncrypt
|
2
|
-
Short description and motivation.
|
3
2
|
|
4
|
-
|
5
|
-
How to use my plugin.
|
3
|
+
Provide manageable Let's Encrypt Certificate for Rails.
|
6
4
|
|
7
5
|
## Installation
|
8
|
-
|
6
|
+
|
7
|
+
Puts this in your Gemfile:
|
9
8
|
|
10
9
|
```ruby
|
11
|
-
gem '
|
10
|
+
gem 'rails-letsencrypt'
|
12
11
|
```
|
13
12
|
|
14
|
-
|
13
|
+
Run install migrations
|
15
14
|
```bash
|
16
|
-
|
15
|
+
rake letsencrypt:install:migrations
|
16
|
+
rake db:migrate
|
17
17
|
```
|
18
18
|
|
19
|
-
|
20
|
-
```
|
21
|
-
|
19
|
+
Add `acme-challenge` mounts in `config/routes.rb`
|
20
|
+
```ruby
|
21
|
+
mount LetsEncrypt::Engine => '/.well-known'
|
22
22
|
```
|
23
23
|
|
24
|
-
##
|
25
|
-
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
The SSL certificate setup is depend on web server, this gem can work with `ngx_mruby` or `kong`.
|
27
|
+
|
28
|
+
### ngx_mruby
|
29
|
+
|
30
|
+
The setup is following this [Article](http://hb.matsumoto-r.jp/entry/2017/03/23/173236)
|
31
|
+
|
32
|
+
Add `config/initializers/letsencrypt.rb` to add config to sync certificate.
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
LetsEncrypt.config.redis_url = 'redis://localhost:6379/1'
|
36
|
+
LetsEncrypt.config.save_to_redis = true
|
37
|
+
```
|
38
|
+
|
39
|
+
Connect `Redis` when nginx worker start
|
40
|
+
```
|
41
|
+
http {
|
42
|
+
# ...
|
43
|
+
mruby_init_worker_code '
|
44
|
+
userdata = Userdata.new
|
45
|
+
userdata.redis = Redis.new "127.0.0.1", 6379
|
46
|
+
# If your redis database is not 0, please select a correct one
|
47
|
+
userdata.redis.select 1
|
48
|
+
';
|
49
|
+
}
|
50
|
+
```
|
51
|
+
|
52
|
+
Setup SSL using mruby
|
53
|
+
```
|
54
|
+
server {
|
55
|
+
listen 443 ssl;
|
56
|
+
server_name _;
|
57
|
+
|
58
|
+
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
59
|
+
ssl_ciphers HIGH:!aNULL:!MD5;
|
60
|
+
ssl_certificate certs/dummy.crt;
|
61
|
+
ssl_certificate_key certs/dummy.key;
|
62
|
+
|
63
|
+
mruby_ssl_handshake_handler_code '
|
64
|
+
ssl = Nginx::SSL.new
|
65
|
+
domain = ssl.servername
|
66
|
+
|
67
|
+
redis = Userdata.new.redis
|
68
|
+
unless redis["#{domain}.crt"].nil? and redis["#{domain}.key"].nil?
|
69
|
+
ssl.certificate_data = redis["#{domain}.crt"]
|
70
|
+
ssl.certificate_key_data = redis["#{domain}.key"]
|
71
|
+
end
|
72
|
+
';
|
73
|
+
}
|
74
|
+
```
|
75
|
+
|
76
|
+
### Kong
|
77
|
+
|
78
|
+
Not support now.
|
26
79
|
|
27
80
|
## License
|
28
81
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -7,11 +7,20 @@ module LetsEncrypt
|
|
7
7
|
validates :domain, presence: true, uniqueness: true
|
8
8
|
|
9
9
|
before_create -> { self.key = OpenSSL::PKey::RSA.new(4096).to_s }
|
10
|
+
after_save -> { save_to_redis }, if: -> { LetsEncrypt.config.use_redis? }
|
10
11
|
|
11
12
|
def get
|
12
13
|
verify && issue
|
13
14
|
end
|
14
15
|
|
16
|
+
def bundle
|
17
|
+
[intermediaries, certificate].join("\n")
|
18
|
+
end
|
19
|
+
|
20
|
+
def save_to_redis
|
21
|
+
LetsEncrypt::Redis.save(self)
|
22
|
+
end
|
23
|
+
|
15
24
|
protected
|
16
25
|
|
17
26
|
def logger
|
data/lib/letsencrypt.rb
CHANGED
@@ -1,52 +1,63 @@
|
|
1
1
|
require 'openssl'
|
2
2
|
require 'acme-client'
|
3
3
|
require 'letsencrypt/engine'
|
4
|
+
require 'letsencrypt/configuration'
|
4
5
|
require 'letsencrypt/logger_proxy'
|
6
|
+
require 'letsencrypt/redis'
|
5
7
|
|
6
8
|
# :nodoc:
|
7
9
|
module LetsEncrypt
|
8
|
-
|
9
|
-
|
10
|
-
end
|
10
|
+
ENDPOINT = 'https://acme-v01.api.letsencrypt.org/'.freeze
|
11
|
+
ENDPOINT_STAGING = 'https://acme-staging.api.letsencrypt.org'.freeze
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
13
|
+
class << self
|
14
|
+
def client
|
15
|
+
@client ||= ::Acme::Client.new(
|
16
|
+
private_key: private_key,
|
17
|
+
endpoint: endpoint
|
18
|
+
)
|
19
|
+
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
else
|
25
|
-
'https://acme-staging.api.letsencrypt.org'
|
26
|
-
end
|
27
|
-
end
|
21
|
+
def private_key
|
22
|
+
@private_key ||= OpenSSL::PKey::RSA.new(load_private_key)
|
23
|
+
end
|
28
24
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
true
|
35
|
-
end
|
25
|
+
def load_private_key
|
26
|
+
return ENV['LETSENCRYPT_PRIVATE_KEY'] if config.use_env_key
|
27
|
+
return File.open(private_key_path) if private_key_path.exist?
|
28
|
+
generate_private_key
|
29
|
+
end
|
36
30
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
31
|
+
def endpoint
|
32
|
+
@endpoint ||= Rails.env.production? ? ENDPOINT : ENDPOINT_STAGING
|
33
|
+
end
|
41
34
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
35
|
+
def register(email)
|
36
|
+
registration = client.register(contact: "mailto:#{email}")
|
37
|
+
logger.info "Successfully registered private key with address #{email}"
|
38
|
+
registration.agree_terms
|
39
|
+
logger.info 'Terms have been accepted'
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
43
|
+
def private_key_path
|
44
|
+
# TODO: Add options for specify path
|
45
|
+
config.private_key_path || Rails.root.join('config', 'letsencrypt.key')
|
46
|
+
end
|
47
|
+
|
48
|
+
def generate_private_key
|
49
|
+
key = OpenSSL::PKey::RSA.new(4096)
|
50
|
+
File.open(private_key_path, 'w') { |f| f.write(key.to_s) }
|
51
|
+
logger.info "Created new private key for Let's Encrypt"
|
52
|
+
key
|
53
|
+
end
|
54
|
+
|
55
|
+
def logger
|
56
|
+
@logger ||= LoggerProxy.new(Rails.logger, tags: ['LetsEncrypt'])
|
57
|
+
end
|
48
58
|
|
49
|
-
|
50
|
-
|
59
|
+
def config
|
60
|
+
@config ||= Configuration.new
|
61
|
+
end
|
51
62
|
end
|
52
63
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module LetsEncrypt
|
2
|
+
# :nodoc:
|
3
|
+
class Configuration
|
4
|
+
include ActiveSupport::Configurable
|
5
|
+
|
6
|
+
config_accessor :private_key_path
|
7
|
+
config_accessor :use_env_key do
|
8
|
+
false
|
9
|
+
end
|
10
|
+
|
11
|
+
config_accessor :save_to_redis
|
12
|
+
config_accessor :redis_url
|
13
|
+
|
14
|
+
def use_redis?
|
15
|
+
save_to_redis == true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module LetsEncrypt
|
2
|
+
# :nodoc:
|
3
|
+
class Redis
|
4
|
+
class << self
|
5
|
+
def connection
|
6
|
+
@connection ||= ::Redis.new(url: LetsEncrypt.config.redis_url)
|
7
|
+
end
|
8
|
+
|
9
|
+
def save(cert)
|
10
|
+
LetsEncrypt.logger.info "Save #{cert.domain}'s certificate to redis"
|
11
|
+
connection.set "#{cert.domain}.key", cert.key
|
12
|
+
connection.set "#{cert.domain}.crt", cert.certificate
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/letsencrypt/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-letsencrypt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 蒼時弦也
|
@@ -39,13 +39,13 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: redis
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
|
-
type: :
|
48
|
+
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
@@ -86,8 +86,10 @@ files:
|
|
86
86
|
- config/routes.rb
|
87
87
|
- db/migrate/20170505165114_create_lets_encrypt_certificates.rb
|
88
88
|
- lib/letsencrypt.rb
|
89
|
+
- lib/letsencrypt/configuration.rb
|
89
90
|
- lib/letsencrypt/engine.rb
|
90
91
|
- lib/letsencrypt/logger_proxy.rb
|
92
|
+
- lib/letsencrypt/redis.rb
|
91
93
|
- lib/letsencrypt/version.rb
|
92
94
|
- lib/rails-letsencrypt.rb
|
93
95
|
- lib/tasks/lets_encrypt_tasks.rake
|