letsencrypt_webfaction 3.1.1 → 4.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +1 -3
- data.tar.gz.sig +0 -0
- data/.gitignore +4 -0
- data/.rubocop.yml +20 -6
- data/.travis.yml +4 -4
- data/CHANGELOG.md +21 -0
- data/Gemfile +4 -2
- data/README.md +36 -11
- data/Rakefile +2 -0
- data/certs/will_in_wi.pem +8 -8
- data/docs/rbenv.md +6 -8
- data/docs/upgrading.md +27 -0
- data/exe/letsencrypt_webfaction +1 -0
- data/letsencrypt_webfaction.gemspec +6 -6
- data/lib/letsencrypt_webfaction.rb +3 -1
- data/lib/letsencrypt_webfaction/application.rb +3 -1
- data/lib/letsencrypt_webfaction/application/init.rb +3 -1
- data/lib/letsencrypt_webfaction/application/run.rb +24 -12
- data/lib/letsencrypt_webfaction/application/version.rb +3 -1
- data/lib/letsencrypt_webfaction/certificate_installer.rb +5 -2
- data/lib/letsencrypt_webfaction/certificate_issuer.rb +17 -3
- data/lib/letsencrypt_webfaction/domain_validator.rb +15 -14
- data/lib/letsencrypt_webfaction/errors.rb +2 -0
- data/lib/letsencrypt_webfaction/logger_output.rb +2 -0
- data/lib/letsencrypt_webfaction/options.rb +7 -4
- data/lib/letsencrypt_webfaction/options/certificate.rb +6 -2
- data/lib/letsencrypt_webfaction/webfaction_api_credentials.rb +3 -0
- data/templates/letsencrypt_webfaction.toml +5 -4
- metadata +30 -17
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef1b9fb8a70fb210d300ae1d935498127533ada35554769a9def621471f1796e
|
4
|
+
data.tar.gz: 5a43d8bd43ea051733aaadc427406cf73d38c5658ad2cbbaf40bf016cc57d55d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7137d662565e1500b2fc184ffba6e1ba4eff4de8537bd06bb221d9a84f4f3f0ec9a84626b044c50a9037cc7ac413c58544c96aa546cf0b9ebf732d31cb563565
|
7
|
+
data.tar.gz: b2f5ad87fccd62fbf07db029918f8d8d49435b3984eec8a27791ff0369740f710d86561240cbfb4f5664024ac81ec081e77ec3ac9f2454a6ba8c6c5b04c941a5
|
checksums.yaml.gz.sig
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
�7
|
3
|
-
�;¶�kg�xk1W��Z�5}�&��Fƚ�Vd�Z=e{��=�3���J���J�0�/��2�f�kw�KM��[�^�
|
1
|
+
~T����jʙ���ɴ�6LS��y��ٞ�ܱd��?���`oB�v�FC|�-8�Z�R�s3,En�:m�?��?��Zt�[j,yEk��;�����[,��i/��IO��� ��3[Y�iA�&Tn�f8���@��zX��%8ܗ��|�%m(8�Q�6w��f���~4����~T#�8�A�;�.E����]�th�[���-����'ֆ��%:��_�:�[ϝ�>�+Nio�;�C%1W�Ӯ��4;<
|
data.tar.gz.sig
CHANGED
Binary file
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
+
require: rubocop-performance
|
2
|
+
|
1
3
|
AllCops:
|
2
4
|
Exclude:
|
3
5
|
# These are autogenerated binstubs.
|
4
6
|
- 'bin/*'
|
5
7
|
# Keep rubocop from scanning installed gems.
|
6
8
|
- 'vendor/**/*'
|
7
|
-
TargetRubyVersion: 2.
|
9
|
+
TargetRubyVersion: 2.4
|
8
10
|
# Line length is something that isn't dogmatic. 80 chars is a good recommendation.
|
9
|
-
|
11
|
+
Layout/LineLength:
|
10
12
|
Enabled: false
|
11
13
|
# This requires leading comments which can tend to be redundant.
|
12
14
|
Style/Documentation:
|
@@ -24,10 +26,6 @@ Metrics/ModuleLength:
|
|
24
26
|
# Tests involve piles of code.
|
25
27
|
- 'spec/**/*'
|
26
28
|
|
27
|
-
# I'm not pulling in a library, or forcing Ruby 2.3+
|
28
|
-
Layout/IndentHeredoc:
|
29
|
-
Enabled: false
|
30
|
-
|
31
29
|
# When we use $stderr.puts, we don't see that as verbose.
|
32
30
|
Style/StderrPuts:
|
33
31
|
Enabled: false
|
@@ -68,3 +66,19 @@ Style/TrailingCommaInArguments:
|
|
68
66
|
# Seems buggy for now.
|
69
67
|
Layout/ClosingHeredocIndentation:
|
70
68
|
Enabled: false
|
69
|
+
|
70
|
+
# Enable new cops
|
71
|
+
Layout/SpaceAroundMethodCallOperator:
|
72
|
+
Enabled: true
|
73
|
+
Lint/RaiseException:
|
74
|
+
Enabled: true
|
75
|
+
Lint/StructNewOverride:
|
76
|
+
Enabled: true
|
77
|
+
Style/ExponentialNotation:
|
78
|
+
Enabled: true
|
79
|
+
Style/HashEachMethods:
|
80
|
+
Enabled: true
|
81
|
+
Style/HashTransformKeys:
|
82
|
+
Enabled: true
|
83
|
+
Style/HashTransformValues:
|
84
|
+
Enabled: true
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,27 @@ Unreleased
|
|
2
2
|
|
3
3
|
* Your change here!
|
4
4
|
|
5
|
+
v4.0.2
|
6
|
+
|
7
|
+
* Fix issues with the key not being registered correctly. #168
|
8
|
+
|
9
|
+
v4.0.1
|
10
|
+
|
11
|
+
* Require Ruby >=2.4 (mostly because Faraday, which this depends on, doesn't support 2.2 anymore. Also not support 2.3 because of the xmlrpc library extraction. This just makes things easier, and it seems like WebFaction supports this new version of Ruby everywhere now.)
|
12
|
+
|
13
|
+
v4.0.0
|
14
|
+
|
15
|
+
* Support ACMEv2
|
16
|
+
* No longer adds intermediate certs to bundle, as these don't appear to be provided.
|
17
|
+
|
18
|
+
v3.2.0
|
19
|
+
|
20
|
+
* New `--force` argument for easier handling of `endpoint` switching. Fixes [#132](https://github.com/will-in-wi/letsencrypt-webfaction/issues/132)
|
21
|
+
|
22
|
+
v3.1.2
|
23
|
+
|
24
|
+
* [#147](https://github.com/will-in-wi/letsencrypt-webfaction/pull/147) - Changed `RENEWAL_DELTA` to 30 days per LetsEncrypt's recommendation. (@shannonturner)
|
25
|
+
|
5
26
|
v3.1.1
|
6
27
|
|
7
28
|
* Fixed a missing require when fetching version. Fixes [#146](https://github.com/will-in-wi/letsencrypt-webfaction/issues/146)
|
data/Gemfile
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
source 'https://rubygems.org'
|
2
4
|
|
3
5
|
# Specify your gem's dependencies in test_gem.gemspec
|
4
6
|
gemspec
|
5
7
|
|
6
8
|
group :development, :test do
|
7
|
-
gem 'bundler', '~> 1.11'
|
8
9
|
gem 'pry', '~> 0.10'
|
9
10
|
gem 'pry-byebug', '~> 3.3'
|
10
11
|
gem 'pry-doc'
|
11
12
|
gem 'rake', '~> 12.0'
|
12
13
|
gem 'rspec', '~> 3.4'
|
13
|
-
gem 'rubocop', '~> 0.
|
14
|
+
gem 'rubocop', '~> 0.82.0'
|
15
|
+
gem 'rubocop-performance'
|
14
16
|
gem 'simplecov', '~> 0.11'
|
15
17
|
gem 'timecop', '~> 0.9.1'
|
16
18
|
gem 'webmock', '~> 3.4'
|
data/README.md
CHANGED
@@ -2,7 +2,17 @@
|
|
2
2
|
|
3
3
|
LetsEncrypt utility client for WebFaction hosts.
|
4
4
|
|
5
|
-
*
|
5
|
+
## *WebFaction has released first-party support for Let's Encrypt Certs!*
|
6
|
+
|
7
|
+
The long-awaited support by [webfaction is here!](https://blog.webfaction.com/2018/09/issue-lets-encrypt-ssl-certificates-with-the-control-panel/) See [the blog post for details about how to use it](https://blog.webfaction.com/2018/09/issue-lets-encrypt-ssl-certificates-with-the-control-panel/), it's really easy! I've switched all of my personal certificates over to their implementation. If you are looking to start adding certificates to your site, start there, not with this tool.
|
8
|
+
|
9
|
+
I am not going to abandon this application outright. Too many people have worked too hard on this to suddenly drop it. But I am not planning any further work on it, unless people find actual bugs. If you can't use the WebFaction control panel to issue your Let's Encrypt certs for some reason and so are using this tool, please file a support ticket with WebFaction and also [comment on this ticket](https://github.com/will-in-wi/letsencrypt-webfaction/issues/160).
|
10
|
+
|
11
|
+
And finally, THANK YOU to all of you who have filed issues, contributed code and documentation, and helped others solve tickets. You have made this a tremendously fun and rewarding project to work on, and helped out so many fellow WebFaction customers.
|
12
|
+
|
13
|
+
## Previous Readme
|
14
|
+
|
15
|
+
*NOTE: Version 4 is out and requires some manual changes. See [the upgrade guide for details](docs/upgrading.md).*
|
6
16
|
|
7
17
|
This tool automates the process of using LetsEncrypt on WebFaction hosts. It can be added to the Cron scheduled task runner where it will validate your domains automatically, obtain the certificates, and then install them using the Webfaction API.
|
8
18
|
|
@@ -51,14 +61,14 @@ All places where you need to substitute a value specific to your setup will be d
|
|
51
61
|
Run the following command in an SSH session to install the letsencrypt_webfaction package via the [RubyGems package management site](https://rubygems.org/gems/letsencrypt_webfaction):
|
52
62
|
|
53
63
|
```sh
|
54
|
-
GEM_HOME=$HOME/.letsencrypt_webfaction/gems RUBYLIB=$GEM_HOME/lib gem2.
|
64
|
+
GEM_HOME=$HOME/.letsencrypt_webfaction/gems RUBYLIB=$GEM_HOME/lib gem2.4 install letsencrypt_webfaction
|
55
65
|
```
|
56
66
|
|
57
67
|
Add the following to `~/.bash_profile` (using, for example, an FTP client or your favorite text editor):
|
58
68
|
|
59
69
|
```sh
|
60
70
|
function letsencrypt_webfaction {
|
61
|
-
PATH=$PATH:$GEM_HOME/bin
|
71
|
+
GEM_HOME=$HOME/.letsencrypt_webfaction/gems PATH=$PATH:$GEM_HOME/bin RUBYLIB=$GEM_HOME/lib ruby2.4 $HOME/.letsencrypt_webfaction/gems/bin/letsencrypt_webfaction $*
|
62
72
|
}
|
63
73
|
```
|
64
74
|
This will simplify the running of the LetsEncrypt WebFaction command, by setting some variables in advance.
|
@@ -67,7 +77,7 @@ After saving `~/.bash_profile`, run the command `source $HOME/.bash_profile` to
|
|
67
77
|
|
68
78
|
Run `letsencrypt_webfaction init` to generate a registration cert and the config file. Open the config file `nano -w ~/letsencrypt_webfaction.toml` and edit to reflect your configuration.
|
69
79
|
|
70
|
-
Now, you are ready to run `letsencrypt_webfaction run` from your SSH session to get certificates. Note that by default the config file `letsencrypt_webfaction.toml` is pointed at the LetsEncrypt staging endpoint (the line that says: `
|
80
|
+
Now, you are ready to run `letsencrypt_webfaction run` from your SSH session to get certificates. Note that by default the config file `letsencrypt_webfaction.toml` is pointed at the LetsEncrypt staging endpoint (the line that says: `directory = "https://acme-staging-v02.api.letsencrypt.org/directory"`); meaning you will only get "test" certificates installed while using the stage endpoint. To issue live certificates you will need to comment out default line, and uncomment the production endpoint line (the line that says: `directory = "https://acme-v02.api.letsencrypt.org/directory" # Production`).
|
71
81
|
|
72
82
|
When you have tested with staging, you can remove the certificate from WebFaction control panel (make sure no webapps are using it first) and re-run with the production endpoint.
|
73
83
|
|
@@ -83,13 +93,28 @@ Finally, if you would like the `http` site to redirect to your `https`, follow t
|
|
83
93
|
|
84
94
|
The syntax of the letsencrypt_webfaction command is as follows:
|
85
95
|
|
86
|
-
$ letsencrypt_webfaction [
|
96
|
+
$ letsencrypt_webfaction [init|run] [*options]
|
97
|
+
|
98
|
+
The commands are `init` and `run`. You can also use `--version` to get the currently installed version of letsencrypt_webfaction.
|
87
99
|
|
88
|
-
|
100
|
+
#### `init`
|
101
|
+
|
102
|
+
Generate registration cert and config file.
|
103
|
+
|
104
|
+
#### `run`
|
105
|
+
|
106
|
+
Generate certs and add to them to the control panel. This command has the following options:
|
107
|
+
|
108
|
+
* `--config=CONFIG`: Use alternative configuration path
|
109
|
+
* `--force`: Re-issue certs regardless of expiration
|
110
|
+
* `--help`: Show help for this command
|
111
|
+
* `--quiet`: Run with minimal output (useful for cron)
|
89
112
|
|
90
113
|
### Testing
|
91
114
|
|
92
|
-
To test certificate issuance, consider using the [LetsEncrypt staging server](https://community.letsencrypt.org/t/testing-against-the-lets-encrypt-staging-environment/6763). This doesn't have the rate limit of 5 certs per domain every 7 days. You can change the `
|
115
|
+
To test certificate issuance, consider using the [LetsEncrypt staging server](https://community.letsencrypt.org/t/testing-against-the-lets-encrypt-staging-environment/6763). This doesn't have the rate limit of 5 certs per domain every 7 days. You can change the `directory` config line to be `https://acme-staging-v02.api.letsencrypt.org/directory` in order to test the system.
|
116
|
+
|
117
|
+
After switching endpoints, you will likely want to run the command with `--force` in order to reissue all certificates from the new endpoint.
|
93
118
|
|
94
119
|
### Operation
|
95
120
|
|
@@ -106,7 +131,7 @@ The Cron task should run daily (or however often you prefer) and will only renew
|
|
106
131
|
Your Cron task should look like:
|
107
132
|
|
108
133
|
```cron
|
109
|
-
18 3 * * * PATH=$PATH:$GEM_HOME/bin:/usr/local/bin GEM_HOME=$HOME/.letsencrypt_webfaction/gems RUBYLIB=$GEM_HOME/lib ruby2.
|
134
|
+
18 3 * * * PATH=$PATH:$GEM_HOME/bin:/usr/local/bin GEM_HOME=$HOME/.letsencrypt_webfaction/gems RUBYLIB=$GEM_HOME/lib ruby2.4 $HOME/.letsencrypt_webfaction/gems/bin/letsencrypt_webfaction run --quiet
|
110
135
|
```
|
111
136
|
|
112
137
|
*Note the usage of `--quiet` to keep the success message from being shown and emailed.*
|
@@ -119,18 +144,18 @@ If you want to be notified upon failure, you can add `MAILTO=[you@youremail.com]
|
|
119
144
|
|
120
145
|
While WebFaction staff maintain your standard server software, the support team will not upgrade your installation of LetsEncrypt WebFaction. You won't usually need to do this unless you have an issue but, as is good practice with most software, it's best kept up to date.
|
121
146
|
|
122
|
-
You can find the current version by running `letsencrypt_webfaction --version`. Sort of. In versions >= 1.1.4, this will work. In older versions, this will just print `letsencrypt_webfaction: version unknown` due to an oversight on my part. So if you get the latter output, just upgrade.
|
147
|
+
You can find the current version by running `letsencrypt_webfaction --version`. Sort of. In versions >= 1.1.4 (except for versions v3.0.0-v3.0.1), this will work. In older versions, this will just print `letsencrypt_webfaction: version unknown` due to an oversight on my part. So if you get the latter output, just upgrade.
|
123
148
|
|
124
149
|
[The changelog](CHANGELOG.md) describes changes from version to version.
|
125
150
|
|
126
|
-
LetsEncrypt WebFaction follows [Semantic Versioning](http://semver.org/). In a nutshell, a version number such as `1.2.
|
151
|
+
LetsEncrypt WebFaction follows [Semantic Versioning](http://semver.org/). In a nutshell, a version number such as `1.2.4` is divided as `major.minor.patch`. When the major version is incremented, you will probably have to change something about the configuration to make it work. The changelog will let you know what changes you need to make. When the minor version is incremented, there are new features but existing features haven't changed. If the patch version is incremented, the changes are all under the hood and shouldn't change or add any existing features.
|
127
152
|
|
128
153
|
TL;DR: Be careful with major version upgrades and you should be fine with upgrading to minor or patch releases.
|
129
154
|
|
130
155
|
To upgrade, run the following command to fetch and install the newest version from RubyGems:
|
131
156
|
|
132
157
|
```sh
|
133
|
-
GEM_HOME=$HOME/.letsencrypt_webfaction/gems RUBYLIB=$GEM_HOME/lib gem2.
|
158
|
+
GEM_HOME=$HOME/.letsencrypt_webfaction/gems RUBYLIB=$GEM_HOME/lib gem2.4 install letsencrypt_webfaction
|
134
159
|
```
|
135
160
|
|
136
161
|
## Development
|
data/Rakefile
CHANGED
data/certs/will_in_wi.pem
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
|
-
|
2
|
+
MIIDhTCCAm2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMRAwDgYDVQQDDAd3aWxs
|
3
3
|
aWFtMRwwGgYKCZImiZPyLGQBGRYMam9obnN0b25oYXVzMRIwEAYKCZImiZPyLGQB
|
4
|
-
|
4
|
+
GRYCdXMwHhcNMjAwNDE2MDIxNzQ1WhcNMjEwNDE2MDIxNzQ1WjBEMRAwDgYDVQQD
|
5
5
|
DAd3aWxsaWFtMRwwGgYKCZImiZPyLGQBGRYMam9obnN0b25oYXVzMRIwEAYKCZIm
|
6
6
|
iZPyLGQBGRYCdXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDl8XJy
|
7
7
|
iFDfTJHbPnQ43vJKAjVPwxRnPhThFeWgYlZ//SU6ZbO4GqewDSMyCrjtWOq+mE59
|
@@ -12,10 +12,10 @@ iL3gD6KBGRCdOVRmX+mgz0mIxchknFslbLE1aU9kNGabVw/25qUVxTid7HN5DAeY
|
|
12
12
|
gkKUO+QWHBNH4QL3AgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAd
|
13
13
|
BgNVHQ4EFgQUFOFAV8TE1Qa285rrUux+StPq5WowIgYDVR0RBBswGYEXd2lsbGlh
|
14
14
|
bUBqb2huc3RvbmhhdXMudXMwIgYDVR0SBBswGYEXd2lsbGlhbUBqb2huc3Rvbmhh
|
15
|
-
|
16
|
-
/
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
dXMudXMwDQYJKoZIhvcNAQEFBQADggEBAMK2SPYRVs6wzv802pqS1fllhrW/a+fZ
|
16
|
+
lU3UP5Gw7VlkFfB7i2J7kafB/kH1Qj6n4e9uu6YhzkodCAszXC0vJdBQoUB+nidO
|
17
|
+
+XFod0RVfCdcYCmhYsF8YMRqbTOPVDtoBXBISGzpt1boQykR6TZcZFkKEPsAAhRW
|
18
|
+
jNRsRelqGB81uWs32PC50OFpQ9Sj8scB/331mAzn//i1F0kiQnQetQDCbr5IieOI
|
19
|
+
is7nzWq9MtbVDHPaE5a10t+7UoSjPzWFe4qKnxjB8RjfGymDvy4+H2eJbRQE932E
|
20
|
+
Dm3/IFNc1K3ekU2WQEZ3O0WHQY8bCBgCAD/U/CiTaLUOm4VsPnYLAx4=
|
21
21
|
-----END CERTIFICATE-----
|
data/docs/rbenv.md
CHANGED
@@ -4,22 +4,20 @@ This method is useful if you are already using RBEnv to manage Ruby, or if you a
|
|
4
4
|
|
5
5
|
Follow the instructions to [set up RBEnv](https://github.com/rbenv/rbenv) and [Ruby Build](https://github.com/rbenv/ruby-build#readme) on your WebFaction server.
|
6
6
|
|
7
|
-
Once you have done so, install Ruby 2.
|
7
|
+
Once you have done so, install Ruby 2.4+. Then set the local Ruby and install the Gem. Finally unset the local Ruby so that you don't run into problems.
|
8
8
|
|
9
|
-
$ rbenv install 2.
|
10
|
-
$ rbenv local 2.
|
9
|
+
$ rbenv install 2.7.0 # Installs Ruby 2.7.0
|
10
|
+
$ rbenv local 2.7.0 # Sets Ruby 2.7.0 as the default version in the current folder.
|
11
11
|
$ gem install letsencrypt_webfaction # Installs this utility from RubyGems.
|
12
12
|
$ rbenv rehash # Makes RBenv aware of the letsencrypt_webfaction utility.
|
13
|
-
$ rm .ruby-version # Unsets Ruby 2.
|
14
|
-
|
15
|
-
*Ruby 2.4.0+ is not supported since they removed the XMLRPC library from core and moved it to a gem. This Gem doesn't work in Ruby <2.3, leaving us with an issue as the majority of system Rubies used with this project are <2.4. So don't use 2.4 for now. If you absolutely want to, make sure you install the xmlrpc gem manually.*
|
13
|
+
$ rm .ruby-version # Unsets Ruby 2.7.0 as the default version in the current folder.
|
16
14
|
|
17
15
|
## Cron usage
|
18
16
|
|
19
17
|
Instead of the cron command in the readme, when using rbenv it would look like the following:
|
20
18
|
|
21
19
|
```cron
|
22
|
-
18 3 * * * RBENV_ROOT=~/.rbenv RBENV_VERSION=2.
|
20
|
+
18 3 * * * RBENV_ROOT=~/.rbenv RBENV_VERSION=2.7.0 ~/.rbenv/bin/rbenv exec letsencrypt_webfaction --letsencrypt_account_email [you@youremail.com] --domains [yourdomain.com,www.yourdomain.com] --public ~/webapps/[yourapp/your_public_html]/ --quiet --username [yourusername] --password [yourpassword]
|
23
21
|
```
|
24
22
|
|
25
23
|
## Upgrading
|
@@ -27,5 +25,5 @@ Instead of the cron command in the readme, when using rbenv it would look like t
|
|
27
25
|
To upgrade the installed version, run:
|
28
26
|
|
29
27
|
```sh
|
30
|
-
RBENV_VERSION=2.
|
28
|
+
RBENV_VERSION=2.7.0 gem install letsencrypt_webfaction
|
31
29
|
```
|
data/docs/upgrading.md
CHANGED
@@ -1,3 +1,30 @@
|
|
1
|
+
# Upgrading from v3 to v4
|
2
|
+
|
3
|
+
Switching to ACMEv2 broke backwards compatibility in a couple ways.
|
4
|
+
|
5
|
+
- You need to change the `endpoint` entry in your config to `directory` and update it to staging or production.
|
6
|
+
```toml
|
7
|
+
directory = "https://acme-staging-v02.api.letsencrypt.org/directory" # Staging
|
8
|
+
#directory = "https://acme-v02.api.letsencrypt.org/directory" # Production
|
9
|
+
```
|
10
|
+
- You need to change all references from Ruby 2.2 to 2.4.
|
11
|
+
Run:
|
12
|
+
```bash
|
13
|
+
GEM_HOME=$HOME/.letsencrypt_webfaction/gems RUBYLIB=$GEM_HOME/lib gem2.4 install letsencrypt_webfaction
|
14
|
+
```
|
15
|
+
And then change
|
16
|
+
```bash
|
17
|
+
function letsencrypt_webfaction {
|
18
|
+
GEM_HOME=$HOME/.letsencrypt_webfaction/gems PATH=$PATH:$GEM_HOME/bin RUBYLIB=$GEM_HOME/lib ruby2.2 $HOME/.letsencrypt_webfaction/gems/bin/letsencrypt_webfaction $*
|
19
|
+
}
|
20
|
+
```
|
21
|
+
to
|
22
|
+
```bash
|
23
|
+
function letsencrypt_webfaction {
|
24
|
+
GEM_HOME=$HOME/.letsencrypt_webfaction/gems PATH=$PATH:$GEM_HOME/bin RUBYLIB=$GEM_HOME/lib ruby2.4 $HOME/.letsencrypt_webfaction/gems/bin/letsencrypt_webfaction $*
|
25
|
+
}
|
26
|
+
```
|
27
|
+
|
1
28
|
# Upgrading from v2 to v3
|
2
29
|
|
3
30
|
Version 3 has a number of major ease of use improvements that break backwards compatibility:
|
data/exe/letsencrypt_webfaction
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
lib = File.expand_path('lib', __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require 'letsencrypt_webfaction'
|
@@ -25,11 +27,9 @@ Gem::Specification.new do |spec|
|
|
25
27
|
spec.cert_chain = ['certs/will_in_wi.pem']
|
26
28
|
spec.signing_key = File.expand_path('~/.ssh/gem-private_key.pem') if $PROGRAM_NAME.end_with?('gem')
|
27
29
|
|
28
|
-
spec.required_ruby_version = '>= 2.
|
29
|
-
|
30
|
-
spec.add_runtime_dependency 'acme-client', '~> 1.0'
|
31
|
-
spec.add_runtime_dependency 'toml-rb', '~> 1.1'
|
30
|
+
spec.required_ruby_version = '>= 2.4.0'
|
32
31
|
|
33
|
-
|
34
|
-
|
32
|
+
spec.add_runtime_dependency 'acme-client', '~> 2.0'
|
33
|
+
spec.add_runtime_dependency 'toml-rb', '~> 2.0'
|
34
|
+
spec.add_runtime_dependency 'xmlrpc', '~> 0.3.0'
|
35
35
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'letsencrypt_webfaction/application/init'
|
2
4
|
require 'letsencrypt_webfaction/application/run'
|
3
5
|
require 'letsencrypt_webfaction/application/version'
|
@@ -18,7 +20,7 @@ module LetsencryptWebfaction
|
|
18
20
|
$stderr.puts "Missing command. Must be one of #{SUPPORTED_COMMANDS.keys.join(', ')}"
|
19
21
|
raise LetsencryptWebfaction::AppExitError, 'Missing command'
|
20
22
|
elsif v2_command?(args)
|
21
|
-
$stderr.puts 'It looks like you are trying to run a version 2 command in version
|
23
|
+
$stderr.puts 'It looks like you are trying to run a version 2 command in version 4'
|
22
24
|
$stderr.puts 'See https://github.com/will-in-wi/letsencrypt-webfaction/blob/master/docs/upgrading.md'
|
23
25
|
raise LetsencryptWebfaction::AppExitError, 'v2 command'
|
24
26
|
else
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'letsencrypt_webfaction/options'
|
2
4
|
|
3
5
|
require 'pathname'
|
@@ -7,7 +9,7 @@ require 'openssl'
|
|
7
9
|
module LetsencryptWebfaction
|
8
10
|
module Application
|
9
11
|
class Init
|
10
|
-
def initialize(_); end
|
12
|
+
def initialize(_); end
|
11
13
|
|
12
14
|
def run!
|
13
15
|
copy_config_file
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'letsencrypt_webfaction/options'
|
2
4
|
require 'letsencrypt_webfaction/errors'
|
3
5
|
require 'letsencrypt_webfaction/webfaction_api_credentials'
|
@@ -11,7 +13,7 @@ require 'pathname'
|
|
11
13
|
module LetsencryptWebfaction
|
12
14
|
module Application
|
13
15
|
class Run
|
14
|
-
RENEWAL_DELTA =
|
16
|
+
RENEWAL_DELTA = 30 # days
|
15
17
|
|
16
18
|
def initialize(args)
|
17
19
|
@config_path = DefaultConfigPath.new
|
@@ -46,6 +48,7 @@ module LetsencryptWebfaction
|
|
46
48
|
|
47
49
|
def validate!
|
48
50
|
return true if @path.exist?
|
51
|
+
|
49
52
|
print_error
|
50
53
|
raise AppExitError, 'config missing'
|
51
54
|
end
|
@@ -70,7 +73,7 @@ module LetsencryptWebfaction
|
|
70
73
|
end
|
71
74
|
end
|
72
75
|
|
73
|
-
def parse_options(args)
|
76
|
+
def parse_options(args) # rubocop:disable Metrics/MethodLength
|
74
77
|
OptionParser.new do |opts|
|
75
78
|
opts.banner = 'Usage: letsencrypt_webfaction run [options]'
|
76
79
|
|
@@ -81,6 +84,10 @@ module LetsencryptWebfaction
|
|
81
84
|
opts.on('--config=CONFIG', 'Alternative configuration path') do |c|
|
82
85
|
@config_path = CustomConfigPath.new(c)
|
83
86
|
end
|
87
|
+
|
88
|
+
opts.on('--force', 'When passed, all certs are re-issued regardless of expiration') do |d|
|
89
|
+
@force_refresh = d
|
90
|
+
end
|
84
91
|
end.parse!(args)
|
85
92
|
end
|
86
93
|
|
@@ -88,7 +95,10 @@ module LetsencryptWebfaction
|
|
88
95
|
wf_cert_list = api_credentials.call('list_certificates')
|
89
96
|
@options.certificates.each do |cert|
|
90
97
|
wf_cert = wf_cert_list.find { |c| c['name'] == cert.cert_name }
|
91
|
-
if
|
98
|
+
if @force_refresh
|
99
|
+
# Issue because nonexistent
|
100
|
+
Out.puts "Force issuing #{cert.cert_name}."
|
101
|
+
elsif wf_cert.nil?
|
92
102
|
# Issue because nonexistent
|
93
103
|
Out.puts "Issuing #{cert.cert_name} for the first time."
|
94
104
|
elsif wf_cert['domains'].split(',').map(&:strip).sort == cert.domains.sort
|
@@ -116,6 +126,7 @@ module LetsencryptWebfaction
|
|
116
126
|
|
117
127
|
def validate_options # rubocop:disable Metrics/MethodLength
|
118
128
|
return if @options.valid?
|
129
|
+
|
119
130
|
$stderr.puts 'The configuration file has an error:'
|
120
131
|
@options.errors.each do |field, error|
|
121
132
|
case error
|
@@ -148,19 +159,20 @@ module LetsencryptWebfaction
|
|
148
159
|
end
|
149
160
|
|
150
161
|
def client
|
151
|
-
@_client ||= Acme::Client.new(private_key: private_key,
|
162
|
+
@_client ||= Acme::Client.new(private_key: private_key, directory: @options.directory)
|
163
|
+
end
|
164
|
+
|
165
|
+
def key_registered?
|
166
|
+
!client.kid.nil?
|
167
|
+
rescue Acme::Client::Error::AccountDoesNotExist
|
168
|
+
false
|
152
169
|
end
|
153
170
|
|
154
171
|
def register_key
|
172
|
+
return if key_registered?
|
173
|
+
|
155
174
|
# If the private key is not known to the server, we need to register it for the first time.
|
156
|
-
|
157
|
-
|
158
|
-
# You'll may need to agree to the term (that's up the to the server to require it or not but boulder does by default)
|
159
|
-
registration.agree_terms
|
160
|
-
rescue Acme::Client::Error::Malformed => e
|
161
|
-
# Stupid hack if the registration already exists.
|
162
|
-
return if e.message == 'Registration key is already in use'
|
163
|
-
raise
|
175
|
+
client.new_account(contact: "mailto:#{@options.letsencrypt_account_email}", terms_of_service_agreed: true)
|
164
176
|
end
|
165
177
|
end
|
166
178
|
end
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'letsencrypt_webfaction'
|
2
4
|
|
3
5
|
module LetsencryptWebfaction
|
4
6
|
module Application
|
5
7
|
class Version
|
6
|
-
def initialize(_); end
|
8
|
+
def initialize(_); end
|
7
9
|
|
8
10
|
def run!
|
9
11
|
puts LetsencryptWebfaction::VERSION
|
@@ -1,10 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'xmlrpc/client'
|
2
4
|
|
3
5
|
module LetsencryptWebfaction
|
4
6
|
class CertificateInstaller
|
5
|
-
def initialize(cert_name, certificate, credentials)
|
7
|
+
def initialize(cert_name, certificate, private_key, credentials)
|
6
8
|
@cert_name = cert_name
|
7
9
|
@certificate = certificate
|
10
|
+
@private_key = private_key
|
8
11
|
@credentials = credentials
|
9
12
|
end
|
10
13
|
|
@@ -15,7 +18,7 @@ module LetsencryptWebfaction
|
|
15
18
|
else
|
16
19
|
'create_certificate'
|
17
20
|
end
|
18
|
-
@credentials.call(action, @cert_name, @certificate
|
21
|
+
@credentials.call(action, @cert_name, @certificate, @private_key.to_pem)
|
19
22
|
|
20
23
|
true
|
21
24
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'acme-client'
|
2
4
|
require 'letsencrypt_webfaction/domain_validator'
|
3
5
|
require 'letsencrypt_webfaction/certificate_installer'
|
@@ -22,19 +24,31 @@ module LetsencryptWebfaction
|
|
22
24
|
|
23
25
|
private
|
24
26
|
|
27
|
+
def order
|
28
|
+
@_order ||= @client.new_order(identifiers: @cert_config.domains)
|
29
|
+
end
|
30
|
+
|
25
31
|
def validator
|
26
|
-
@_validator ||= LetsencryptWebfaction::DomainValidator.new
|
32
|
+
@_validator ||= LetsencryptWebfaction::DomainValidator.new order, @client, @cert_config.public_dirs
|
27
33
|
end
|
28
34
|
|
29
35
|
def certificate_installer
|
30
|
-
@_certificate_installer ||= LetsencryptWebfaction::CertificateInstaller.new(@cert_config.cert_name, certificate, @api_credentials)
|
36
|
+
@_certificate_installer ||= LetsencryptWebfaction::CertificateInstaller.new(@cert_config.cert_name, certificate, csr.private_key, @api_credentials)
|
31
37
|
end
|
32
38
|
|
33
39
|
def certificate
|
34
40
|
# We can now request a certificate, you can pass anything that returns
|
35
41
|
# a valid DER encoded CSR when calling to_der on it, for example a
|
36
42
|
# OpenSSL::X509::Request too.
|
37
|
-
@_certificate ||=
|
43
|
+
@_certificate ||= begin
|
44
|
+
order.finalize(csr: csr)
|
45
|
+
while order.status == 'processing'
|
46
|
+
sleep(2)
|
47
|
+
order.reload
|
48
|
+
end
|
49
|
+
|
50
|
+
order.certificate
|
51
|
+
end
|
38
52
|
end
|
39
53
|
|
40
54
|
def csr
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fileutils'
|
2
4
|
|
3
5
|
module LetsencryptWebfaction
|
4
6
|
class DomainValidator
|
5
|
-
def initialize(
|
6
|
-
@
|
7
|
+
def initialize(order, client, public_dirs)
|
8
|
+
@order = order
|
7
9
|
@client = client
|
8
10
|
@public_dirs = public_dirs.map { |dir| File.expand_path(dir) }
|
9
11
|
end
|
@@ -11,15 +13,18 @@ module LetsencryptWebfaction
|
|
11
13
|
def validate! # rubocop:disable Metrics/MethodLength
|
12
14
|
write_files!
|
13
15
|
|
14
|
-
challenges.map(&:
|
16
|
+
challenges.map(&:request_validation).tap do |requests|
|
15
17
|
next unless requests.any?(&:!)
|
18
|
+
|
16
19
|
$stderr.puts 'Failed to request validations.'
|
17
20
|
return false
|
18
21
|
end
|
19
22
|
|
20
23
|
10.times do
|
24
|
+
challenges.each(&:reload)
|
21
25
|
break if no_challenges_pending?
|
22
|
-
|
26
|
+
|
27
|
+
sleep(2)
|
23
28
|
end
|
24
29
|
|
25
30
|
return true if all_challenges_valid?
|
@@ -30,20 +35,16 @@ module LetsencryptWebfaction
|
|
30
35
|
|
31
36
|
private
|
32
37
|
|
33
|
-
def authorizations
|
34
|
-
@authorizations ||= @domains.map { |domain| @client.authorize(domain: domain) }
|
35
|
-
end
|
36
|
-
|
37
38
|
def challenges
|
38
|
-
@challenges ||= authorizations.map(&:
|
39
|
+
@challenges ||= @order.authorizations.map(&:http)
|
39
40
|
end
|
40
41
|
|
41
42
|
def no_challenges_pending?
|
42
|
-
challenges.none? { |challenge| challenge.
|
43
|
+
challenges.none? { |challenge| challenge.status == 'pending' }
|
43
44
|
end
|
44
45
|
|
45
46
|
def all_challenges_valid?
|
46
|
-
challenges.reject { |challenge| challenge.
|
47
|
+
challenges.reject { |challenge| challenge.status == 'valid' }.empty?
|
47
48
|
end
|
48
49
|
|
49
50
|
def write_files!
|
@@ -59,7 +60,7 @@ module LetsencryptWebfaction
|
|
59
60
|
end
|
60
61
|
|
61
62
|
def print_errors
|
62
|
-
validations = authorizations.map(&:domain).zip(challenges)
|
63
|
+
validations = @order.authorizations.map(&:domain).zip(challenges)
|
63
64
|
$stderr.puts 'Failed to verify statuses.'
|
64
65
|
validations.each { |tuple| Validation.new(*tuple).print_error }
|
65
66
|
end
|
@@ -71,7 +72,7 @@ module LetsencryptWebfaction
|
|
71
72
|
end
|
72
73
|
|
73
74
|
def print_error # rubocop:disable Metrics/MethodLength
|
74
|
-
case @challenge.
|
75
|
+
case @challenge.status
|
75
76
|
when 'valid'
|
76
77
|
$stderr.puts "#{@domain}: Success"
|
77
78
|
when 'invalid'
|
@@ -80,7 +81,7 @@ module LetsencryptWebfaction
|
|
80
81
|
when 'pending'
|
81
82
|
$stderr.puts "#{@domain}: Still pending, but timed out"
|
82
83
|
else
|
83
|
-
$stderr.puts "#{@domain}: Unexpected authorization status #{@challenge.
|
84
|
+
$stderr.puts "#{@domain}: Unexpected authorization status #{@challenge.status}"
|
84
85
|
end
|
85
86
|
end
|
86
87
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'toml-rb'
|
2
4
|
require 'socket'
|
3
5
|
|
@@ -5,9 +7,9 @@ require 'letsencrypt_webfaction/options/certificate'
|
|
5
7
|
|
6
8
|
module LetsencryptWebfaction
|
7
9
|
class Options
|
8
|
-
NON_BLANK_FIELDS = %i[username password letsencrypt_account_email
|
10
|
+
NON_BLANK_FIELDS = %i[username password letsencrypt_account_email directory api_url servername].freeze
|
9
11
|
|
10
|
-
WEBFACTION_API_URL = 'https://api.webfaction.com/'
|
12
|
+
WEBFACTION_API_URL = 'https://api.webfaction.com/'
|
11
13
|
|
12
14
|
def initialize(args)
|
13
15
|
@config = args
|
@@ -39,8 +41,8 @@ module LetsencryptWebfaction
|
|
39
41
|
@config['letsencrypt_account_email']
|
40
42
|
end
|
41
43
|
|
42
|
-
def
|
43
|
-
@config['
|
44
|
+
def directory
|
45
|
+
@config['directory']
|
44
46
|
end
|
45
47
|
|
46
48
|
def api_url
|
@@ -57,6 +59,7 @@ module LetsencryptWebfaction
|
|
57
59
|
|
58
60
|
def errors
|
59
61
|
{}.tap do |e|
|
62
|
+
e[:endpoint] = 'needs to be updated to directory. See upgrade documentation.' if @config.key?('endpoint')
|
60
63
|
NON_BLANK_FIELDS.each do |field|
|
61
64
|
e[field] = "can't be blank" if public_send(field).nil? || public_send(field) == ''
|
62
65
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module LetsencryptWebfaction
|
2
4
|
class Options
|
3
5
|
class Certificate
|
4
6
|
SUPPORTED_VALIDATION_METHODS = ['http01'].freeze
|
5
|
-
VALID_CERT_NAME = /[^a-zA-Z\d_]
|
7
|
+
VALID_CERT_NAME = /[^a-zA-Z\d_]/.freeze
|
6
8
|
VALID_KEY_SIZES = [2048, 4096].freeze
|
7
9
|
|
8
10
|
def initialize(args)
|
@@ -11,6 +13,7 @@ module LetsencryptWebfaction
|
|
11
13
|
|
12
14
|
def domains
|
13
15
|
return [] if @args['domains'].nil? || @args['domains'] == ''
|
16
|
+
|
14
17
|
Array(@args['domains'])
|
15
18
|
end
|
16
19
|
|
@@ -20,6 +23,7 @@ module LetsencryptWebfaction
|
|
20
23
|
|
21
24
|
def public_dirs
|
22
25
|
return [] if @args['public'].nil? || @args['public'] == ''
|
26
|
+
|
23
27
|
Array(@args['public'])
|
24
28
|
end
|
25
29
|
|
@@ -41,7 +45,7 @@ module LetsencryptWebfaction
|
|
41
45
|
e[:method] = 'must be "http01"' unless SUPPORTED_VALIDATION_METHODS.include?(validation_method)
|
42
46
|
e[:public] = "can't be empty" if public_dirs.none?
|
43
47
|
e[:name] = "can't be blank" if cert_name.nil? || cert_name == ''
|
44
|
-
e[:name] = 'can only include letters, numbers, and underscores' if cert_name
|
48
|
+
e[:name] = 'can only include letters, numbers, and underscores' if VALID_CERT_NAME.match?(cert_name)
|
45
49
|
e[:key_size] = "must be one of #{VALID_KEY_SIZES.join(', ')}" unless VALID_KEY_SIZES.include?(key_size)
|
46
50
|
end
|
47
51
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'xmlrpc/client'
|
2
4
|
|
3
5
|
module LetsencryptWebfaction
|
@@ -24,6 +26,7 @@ module LetsencryptWebfaction
|
|
24
26
|
!session_id.nil?
|
25
27
|
rescue XMLRPC::FaultException => e
|
26
28
|
return false if e.message == 'LoginError'
|
29
|
+
|
27
30
|
raise
|
28
31
|
end
|
29
32
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Your Webfaction username and password
|
1
|
+
# Your Webfaction username and password, for the API & control panel, not SSH
|
2
2
|
username = "myusername"
|
3
3
|
password = "mypassword"
|
4
4
|
|
@@ -6,9 +6,10 @@ password = "mypassword"
|
|
6
6
|
letsencrypt_account_email = "me@example.com"
|
7
7
|
|
8
8
|
# The ACME endpoint. Use the staging server until you get everything working.
|
9
|
-
# Then switch to the production endpoint.
|
10
|
-
|
11
|
-
|
9
|
+
# Then switch to the production endpoint. You may want to run with the --force
|
10
|
+
# command after switching to reissue all certificates.
|
11
|
+
directory = "https://acme-staging-v02.api.letsencrypt.org/directory" # Staging
|
12
|
+
#directory = "https://acme-v02.api.letsencrypt.org/directory" # Production
|
12
13
|
|
13
14
|
# The URL to the WebFaction API. You should not change this under normal
|
14
15
|
# circumstances.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: letsencrypt_webfaction
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Johnston
|
@@ -10,9 +10,9 @@ bindir: exe
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
13
|
+
MIIDhTCCAm2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMRAwDgYDVQQDDAd3aWxs
|
14
14
|
aWFtMRwwGgYKCZImiZPyLGQBGRYMam9obnN0b25oYXVzMRIwEAYKCZImiZPyLGQB
|
15
|
-
|
15
|
+
GRYCdXMwHhcNMjAwNDE2MDIxNzQ1WhcNMjEwNDE2MDIxNzQ1WjBEMRAwDgYDVQQD
|
16
16
|
DAd3aWxsaWFtMRwwGgYKCZImiZPyLGQBGRYMam9obnN0b25oYXVzMRIwEAYKCZIm
|
17
17
|
iZPyLGQBGRYCdXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDl8XJy
|
18
18
|
iFDfTJHbPnQ43vJKAjVPwxRnPhThFeWgYlZ//SU6ZbO4GqewDSMyCrjtWOq+mE59
|
@@ -23,14 +23,14 @@ cert_chain:
|
|
23
23
|
gkKUO+QWHBNH4QL3AgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAd
|
24
24
|
BgNVHQ4EFgQUFOFAV8TE1Qa285rrUux+StPq5WowIgYDVR0RBBswGYEXd2lsbGlh
|
25
25
|
bUBqb2huc3RvbmhhdXMudXMwIgYDVR0SBBswGYEXd2lsbGlhbUBqb2huc3Rvbmhh
|
26
|
-
|
27
|
-
/
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
dXMudXMwDQYJKoZIhvcNAQEFBQADggEBAMK2SPYRVs6wzv802pqS1fllhrW/a+fZ
|
27
|
+
lU3UP5Gw7VlkFfB7i2J7kafB/kH1Qj6n4e9uu6YhzkodCAszXC0vJdBQoUB+nidO
|
28
|
+
+XFod0RVfCdcYCmhYsF8YMRqbTOPVDtoBXBISGzpt1boQykR6TZcZFkKEPsAAhRW
|
29
|
+
jNRsRelqGB81uWs32PC50OFpQ9Sj8scB/331mAzn//i1F0kiQnQetQDCbr5IieOI
|
30
|
+
is7nzWq9MtbVDHPaE5a10t+7UoSjPzWFe4qKnxjB8RjfGymDvy4+H2eJbRQE932E
|
31
|
+
Dm3/IFNc1K3ekU2WQEZ3O0WHQY8bCBgCAD/U/CiTaLUOm4VsPnYLAx4=
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date:
|
33
|
+
date: 2020-08-23 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: acme-client
|
@@ -38,28 +38,42 @@ dependencies:
|
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
41
|
+
version: '2.0'
|
42
42
|
type: :runtime
|
43
43
|
prerelease: false
|
44
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
48
|
+
version: '2.0'
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: toml-rb
|
51
51
|
requirement: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
55
|
+
version: '2.0'
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
62
|
+
version: '2.0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: xmlrpc
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.3.0
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.3.0
|
63
77
|
description: A tool to simplify the manual process of using LetsEncrypt on Webfaction
|
64
78
|
hosts. It can be added to cron where it will validate your domains automatically,
|
65
79
|
place the generated certs in a common folder, and then email the WebFaction support
|
@@ -117,15 +131,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
117
131
|
requirements:
|
118
132
|
- - ">="
|
119
133
|
- !ruby/object:Gem::Version
|
120
|
-
version: 2.
|
134
|
+
version: 2.4.0
|
121
135
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
136
|
requirements:
|
123
137
|
- - ">="
|
124
138
|
- !ruby/object:Gem::Version
|
125
139
|
version: '0'
|
126
140
|
requirements: []
|
127
|
-
|
128
|
-
rubygems_version: 2.7.7
|
141
|
+
rubygems_version: 3.1.2
|
129
142
|
signing_key:
|
130
143
|
specification_version: 4
|
131
144
|
summary: LetsEncrypt utility client for WebFaction hosts.
|
metadata.gz.sig
CHANGED
Binary file
|