anchor-pki 0.6.3 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 72bacc57511a5e60ad14e2820a55f19149a2a705fbaa7c80af60484486f0a47d
4
- data.tar.gz: 3eb671fa661b08f028062b8ee9733ec3831fd2c5acde15875d24f92fcb6c19bf
3
+ metadata.gz: 668bda70c37b6cfed433ff05de800a8e2a4f1576a6a16b73d0c653794890938a
4
+ data.tar.gz: 9c96396faf03bed36249890bd19682988bdbb52d4e5eca4fe7994bbfaddf66f8
5
5
  SHA512:
6
- metadata.gz: 266f699b84d1b6b03ef6c5273109b209dd13fa2cbae54eb7260d85edd0f9b4f3295b6dedf20bf8e2dedaa1fdad7e734784b0d6dfdbc276c15912cb76d4b9ff90
7
- data.tar.gz: bc78aa5f6692a2ae80cf53c8ea38c3ee5a4d32ca4232bf74fbaf6c8784ce84d899ede38854c8b429e4fb22d2583f5278f470c0cb75c662babc3650c3c26b277e
6
+ metadata.gz: 6a8a30a3eb39f5544250bf12338c31d7f3392fda4440a74dc916c28ffac5d2817b8687a911695db06d46f236f7e27857a482abb172854f7d9fd88e5332115749
7
+ data.tar.gz: 004d41141dcca7ef89f994f726e0502c43957ce0c144d09fc719f71292f9abdc1a7cb45c6a57f75a84debd9ca2ac3f2085778879e104f4349bae51100c46909e
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.7.0] - 2024-01-11
4
+
5
+ - inherit from the puma-acme plugin in auto\_cert plugin
6
+ - remove extraneous config & environment settings
7
+
3
8
  ## [0.6.3] - 2024-01-10
4
9
 
5
10
  - fixed release (0.6.2 didn't contain the expected changes)
data/Gemfile.lock CHANGED
@@ -2,8 +2,7 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  anchor-pki (0.6.3)
5
- acme-client (~> 2.0.13)
6
- pstore (~> 0.1)
5
+ puma-acme (~> 0.1)
7
6
 
8
7
  GEM
9
8
  remote: https://rubygems.org/
@@ -19,21 +18,36 @@ GEM
19
18
  rexml
20
19
  diff-lcs (1.5.0)
21
20
  docile (1.4.0)
22
- faraday (2.8.1)
23
- base64
24
- faraday-net_http (>= 2.0, < 3.1)
25
- ruby2_keywords (>= 0.0.4)
26
- faraday-net_http (3.0.2)
21
+ faraday (2.9.0)
22
+ faraday-net_http (>= 2.0, < 3.2)
23
+ faraday-net_http (3.1.0)
24
+ net-http
27
25
  faraday-retry (2.2.0)
28
26
  faraday (~> 2.0)
29
27
  hashdiff (1.0.1)
30
28
  json (2.6.3)
31
29
  minitest (5.18.0)
30
+ mustermann (3.0.0)
31
+ ruby2_keywords (~> 0.0.1)
32
+ net-http (0.4.1)
33
+ uri
34
+ nio4r (2.7.0)
32
35
  parallel (1.23.0)
33
36
  parser (3.2.2.1)
34
37
  ast (~> 2.4.1)
35
38
  pstore (0.1.3)
36
39
  public_suffix (5.0.1)
40
+ puma (6.4.2)
41
+ nio4r (~> 2.0)
42
+ puma-acme (0.1.0)
43
+ acme-client (~> 2.0.13)
44
+ pstore (~> 0.1)
45
+ puma (~> 6.4)
46
+ sinatra (~> 3.1)
47
+ rack (2.2.8)
48
+ rack-protection (3.2.0)
49
+ base64 (>= 0.1.0)
50
+ rack (~> 2.2, >= 2.2.4)
37
51
  rainbow (3.1.1)
38
52
  rake (13.1.0)
39
53
  regexp_parser (2.8.0)
@@ -79,7 +93,14 @@ GEM
79
93
  simplecov_json_formatter (~> 0.1)
80
94
  simplecov-html (0.12.3)
81
95
  simplecov_json_formatter (0.1.4)
96
+ sinatra (3.2.0)
97
+ mustermann (~> 3.0)
98
+ rack (~> 2.2, >= 2.2.4)
99
+ rack-protection (= 3.2.0)
100
+ tilt (~> 2.0)
101
+ tilt (2.3.0)
82
102
  unicode-display_width (2.4.2)
103
+ uri (0.13.0)
83
104
  vcr (6.1.0)
84
105
  webmock (3.18.1)
85
106
  addressable (>= 2.8.0)
data/README.md CHANGED
@@ -8,15 +8,13 @@ The Following environment variables are available to configure the default
8
8
  [`AutoCert::Manager`](./lib/anchor/auto_cert/manager.rb).
9
9
 
10
10
  * `HTTPS_PORT` - the TCP numerical port to bind SSL to.
11
- * `ACME_ALLOW_IDENTIFIERS` - A comma separated list of hostnames for provisioning certs
12
- * `ACME_CONTACT` - URL to contact in case of issues with the account
11
+ * `SERVER_NAME`/`SERVER_NAMES` - A comma separated list of hostnames for provisioning certs
13
12
  * `ACME_DIRECTORY_URL` - the ACME provider's directory
14
13
  * `ACME_HMAC_KEY` - your External Account Binding (EAB) HMAC_KEY for authenticating with the ACME directory above
15
14
  * `ACME_KID` - your External Account Binding (EAB) KID for authenticating with the ACME directory above with an
15
+ * `ACME_CONTACT` - **optional** URL to contact in case of issues with the account
16
16
  * `ACME_RENEW_BEFORE_SECONDS` - **optional** Start a renewal this number number of seconds before the cert expires. This defaults to 30 days (2592000 seconds)
17
17
  * `ACME_RENEW_BEFORE_FRACTION` - **optional** Start the renewal when this fraction of a cert's valid window is left. This defaults to 0.5, which means when the cert is in the last 50% of its lifespan a renewal is attempted.
18
- * `AUTO_CERT_CHECK_EVERY` - **optional** the number of seconds to wait between checking if the certificate has expired. This defaults to 1 hour (3600 seconds)
19
- * `AUTO_CERT_NAME` - **optional** the name to use to lookup the default `AutoCert::Configuration` in the `AutoCert::Registry`. This is `default` by default
20
18
 
21
19
  If both `ACME_RENEW_BEFORE_SECONDS` and `ACME_RENEW_BEFORE_FRACTION` are set,
22
20
  the one that causes the renewal to take place earlier is used.
@@ -39,7 +37,7 @@ Currently the `AutoCert::Manager` will use whichever is earlier.
39
37
 
40
38
  ```sh
41
39
  HTTPS_PORT=44300
42
- ACME_ALLOW_IDENTIFIERS=my.lcl.host,*.my.lcl.host
40
+ SERVER_NAMES=my.lcl.host,*.my.lcl.host
43
41
  ACME_DIRECTORY_URL=https://acme-v02.api.letsencrypt.org/directory
44
42
  ACME_KID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
45
43
  ACME_HMAC_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -1,236 +1,52 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Anchor
4
+ # This module is here in order to communicate plugin configuration options
5
+ # to the plugin since the plugin is created dynamically and it is loaded and
6
+ # initialized without any configuration options.
4
7
  module AutoCert
8
+ config_keys = %i[
9
+ algorithm
10
+ cache
11
+ cache_dir
12
+ contact
13
+ directory
14
+ eab_kid
15
+ eab_hmac_key
16
+ enabled
17
+ mode
18
+ port
19
+ renew_at
20
+ renew_interval
21
+ server_name
22
+ server_names
23
+ tos_agreed
24
+ ]
25
+
5
26
  # AutoCert Configuration provides a way to configure the AutoCert Manager.
6
27
  #
7
- class Configuration
8
- DEFAULT_RENEW_BEFORE_SECONDS = 60 * 60 * 24 * 30 # 30 days in seconds
9
- DEFAULT_RENEW_BEFORE_FRACTION = 0.5 # when in the last 50% of the validity window, renew
10
- DEFAULT_CHECK_EVERY_SECONDS = 60 * 60 # 1 day in seconds
11
-
12
- # Note - although it is possible to set change the name of a config, it is
13
- # not recommended. The name is used as the key in the Registry, and if a
14
- # Configuration is in the Registry, and its name is changed, it does not
15
- # change its registry key.
16
- attr_accessor :name,
17
- :allow_identifiers,
18
- :cache_dir,
19
- :check_every_seconds,
20
- :contact,
21
- :directory_url,
22
- :external_account_binding,
23
- :renew_before_fraction,
24
- :renew_before_seconds,
25
- :tos_acceptors,
26
- :work_dir
27
-
28
- # rubocop:disable Metrics/ParameterLists
29
- # Data defined classes have all required parameters in the initializer, so
30
- # override the default initializer to allow for optional parameters and
31
- # to pull in the defaults form the environment
32
- #
33
- def initialize(name:,
34
- allow_identifiers: nil,
35
- cache_dir: nil,
36
- check_every_seconds: nil,
37
- contact: nil,
38
- directory_url: nil,
39
- external_account_binding: nil,
40
- renew_before_fraction: nil,
41
- renew_before_seconds: nil,
42
- tos_acceptors: nil,
43
- work_dir: nil)
44
-
45
- @name = name
46
-
47
- @allow_identifiers = allow_identifiers
48
- @cache_dir = cache_dir
49
- @check_every_seconds = check_every_seconds
50
- @contact = contact
51
- @directory_url = directory_url
52
- @external_account_binding = external_account_binding
53
- @renew_before_fraction = renew_before_fraction
54
- @renew_before_seconds = renew_before_seconds
55
- @tos_acceptors = tos_acceptors
56
- @work_dir = work_dir
57
- end
58
- # rubocop:enable Metrics/ParameterLists
59
-
60
- def account
61
- {
62
- contact: contact,
63
- external_account_binding: external_account_binding
64
- }
65
- end
66
-
67
- # Enabled just means that the configuration is valid
68
- def enabled?
69
- validate!
70
- true
71
- rescue ConfigurationError => _e
72
- false
73
- end
74
-
75
- def validate!
76
- @allow_identifiers = prepare_allow_identifiers(@allow_identifiers)
77
- @cache_dir = prepare_directory(dir: @cache_dir, property: 'cache_dir')
78
- @check_every_seconds = prepare_check_every_seconds(@check_every_seconds)
79
- @contact = prepare_contact(@contact)
80
- @directory_url = prepare_directory_url(@directory_url)
81
- @external_account_binding = prepare_external_account_binding(@external_account_binding)
82
- @renew_before_fraction = prepare_renew_before_fraction(@renew_before_fraction)
83
- @renew_before_seconds = prepare_renew_before_seconds(@renew_before_seconds)
84
- @tos_acceptors = prepare_tos_acceptors(@tos_acceptors)
85
- @work_dir = prepare_directory(dir: @work_dir, property: 'work_dir')
86
- self
87
- end
88
-
89
- # Return the fallback identifer for this configuration
90
-
91
- # look at all the identifiers, strip a leading wildcard off of all of
92
- # them and then pick the one that has the fewest '.' in it, if there are
93
- # ties for fewest, pick the first one in the list of ties. A minimum of
94
- # 2 '.' is required.
95
- #
96
- def fallback_identifier
97
- de_wildcarded = allow_identifiers.map { |i| i.sub(/^\*\./, '') }
98
- not_tld = de_wildcarded.select { |i| i.count('.') >= 2 }
99
- ordered = not_tld.sort_by { |i| i.count('.') }
100
- ordered[0]
101
- end
102
-
103
- private
104
-
105
- def prepare_allow_identifiers(allow_identifiers)
106
- prepared = case allow_identifiers
107
- when Array
108
- allow_identifiers
109
- when String
110
- allow_identifiers.split(',')
111
- when nil
112
- ENV.fetch('ACME_ALLOW_IDENTIFIERS', nil)&.split(',')
113
- end
114
-
115
- if prepared.nil? || prepared.empty?
116
- raise ConfigurationError,
117
- "The '#{name}' #{self.class} instance has a misconfigured " \
118
- '`allow_identifiers` value. Set it to a string, or an array of strings, ' \
119
- 'or set the ACME_ALLOW_IDENTIFIERS environment variable ' \
120
- 'to a comma separated list of identifiers.'
121
- end
122
-
123
- prepared
124
- end
125
-
126
- def prepare_check_every_seconds(check_every_seconds)
127
- message = "The '#{name}' #{self.class} instance has a misconfigured " \
128
- '`check_every_seconds` value. It must be set to an integer > 0, ' \
129
- 'or set the AUTO_CERT_CHECK_EVERY environment variable.'
130
-
131
- candidates = [
132
- check_every_seconds,
133
- ENV.fetch('AUTO_CERT_CHECK_EVERY', nil),
134
- DEFAULT_CHECK_EVERY_SECONDS
135
- ]
136
-
137
- ensure_positive_integer(candidates, message)
138
- end
139
-
140
- def prepare_contact(contact)
141
- contact ||= ENV.fetch('ACME_CONTACT', nil)
28
+ Configuration = Struct.new(*config_keys, keyword_init: true) do
29
+ alias_method :allow_identifiers=, :server_names=
30
+ alias_method :directory_url=, :directory=
142
31
 
143
- contact
144
- end
145
-
146
- def prepare_directory_url(directory_url)
147
- message = "The '#{name}' #{self.class} instance has a misconfigured `directory_url` value. " \
148
- 'It must be set to a string, or set the ACME_DIRECTORY_URL environment variable.'
149
-
150
- directory_url ||= ENV.fetch('ACME_DIRECTORY_URL', nil)
151
-
152
- raise ConfigurationError, message if directory_url.nil?
153
-
154
- directory_url
155
- end
156
-
157
- def prepare_external_account_binding(external_account_binding)
158
- kid = ENV.fetch('ACME_KID', nil)
159
- hmac_key = ENV.fetch('ACME_HMAC_KEY', nil)
160
-
161
- if external_account_binding && external_account_binding[:kid] && external_account_binding[:hmac_key]
162
- return external_account_binding
163
- end
164
-
165
- { kid: kid, hmac_key: hmac_key }
166
- end
167
-
168
- def prepare_renew_before_seconds(renew_before_seconds)
169
- message = "The '#{name}' #{self.class} instance has a misconfigured " \
170
- '`before_seconds` value. It must be set to an integer > 0, ' \
171
- 'or set the ACME_RENEW_BEFORE_SECONDS environment variable.'
172
-
173
- candidates = [
174
- renew_before_seconds,
175
- ENV.fetch('ACME_RENEW_BEFORE_SECONDS', nil),
176
- DEFAULT_RENEW_BEFORE_SECONDS
177
- ]
178
- ensure_positive_integer(candidates, message)
179
- end
180
-
181
- def prepare_renew_before_fraction(renew_before_fraction)
182
- message = "The '#{name}' #{self.class} instance has a misconfigured " \
183
- '`before_fraction` value. It must be set to a float > 0 and < 1, ' \
184
- 'or set the ACME_RENEW_BEFORE_FRACTION environment variable.'
185
-
186
- candidates = [
187
- renew_before_fraction,
188
- ENV.fetch('ACME_RENEW_BEFORE_FRACTION', nil),
189
- DEFAULT_RENEW_BEFORE_FRACTION
190
- ]
191
-
192
- candidates.each do |candidate|
193
- next if candidate.nil?
32
+ def initialize(opts = {})
33
+ self.directory_url = opts.delete(:directory_url)
34
+ self.allow_identifiers = opts.delete(:allow_identifiers)
194
35
 
195
- as_float = candidate.to_f
196
- return as_float if (0..1).cover?(as_float)
36
+ if (eab = opts.delete(:external_account_binding))
37
+ self.external_account_binding = eab
197
38
  end
198
39
 
199
- # this should really never happen as DEFAULT_RENEW_BEFORE_FRACTION is
200
- # valid
201
- raise ConfigurationError, message
40
+ super(opts)
202
41
  end
203
42
 
204
- def prepare_tos_acceptors(tos_acceptors)
205
- Array(tos_acceptors)
43
+ def server_name=(name)
44
+ self.server_names = [name]
206
45
  end
207
46
 
208
- def prepare_directory(dir:, property:)
209
- return nil if dir.nil?
210
-
211
- dir = Pathname.new(dir) unless dir.is_a?(Pathname)
212
- message = "The '#{name}' #{self.class} instance has a misconfigured " \
213
- "`#{property}` value, it resolves to (#{dir}). " \
214
- 'It must be set to a directory, or a path that can be created.'
215
-
216
- begin
217
- dir.mkpath
218
- rescue StandardError => _e
219
- raise ConfigurationError, message
220
- end
221
-
222
- dir
223
- end
224
-
225
- def ensure_positive_integer(candidates, message)
226
- candidates.each do |candidate|
227
- next if candidate.nil?
228
-
229
- as_int = candidate.to_i
230
- return as_int if as_int.positive?
231
- end
232
-
233
- raise ConfigurationError, message
47
+ def external_account_binding=(eab)
48
+ self.eab_kid = eab[:kid]
49
+ self.eab_hmac_key = eab[:hmac_key]
234
50
  end
235
51
  end
236
52
  end
@@ -4,36 +4,16 @@ module Anchor
4
4
  module AutoCert
5
5
  # AutoCert Railtie
6
6
  class Railtie < Rails::Railtie
7
- name = ENV.fetch('AUTO_CERT_NAME', 'anchor')
8
-
9
7
  # Initialize the configuration with a blank configuration, ensuring
10
8
  # the configuration exists, even if it is not used.
11
- config.auto_cert = ::Anchor::AutoCert::Configuration.new(name: name)
12
-
13
- # Make sure the auto cert configuration is valid before the app boots
14
- # This will run after every code reload in development and after boot in
15
- # production
16
- config.to_prepare do
17
- if Rails.configuration.auto_cert.enabled?
18
- Rails.configuration.auto_cert.validate!
19
-
20
- # register the configuration under its name so that it can
21
- # be discovered by other parts of the application
22
- auto_cert_config = Rails.configuration.auto_cert
23
- unless ::Anchor::AutoCert::Registry.key?(auto_cert_config.name)
24
- ::Anchor::AutoCert::Registry.store(auto_cert_config.name, auto_cert_config)
25
- end
26
- end
27
- end
9
+ config.auto_cert = ::Anchor::AutoCert::Configuration.new
28
10
 
29
11
  # this needs to be after the load_config_initializers so that the
30
12
  # application can override the :rails auto_cert configuration
31
13
  #
32
- initializer 'auto_cert.configure_rails_initialization', after: :load_config_initializers do |app|
33
- auto_cert_config = Railtie.determine_configuration(app)
34
- app.config.auto_cert = auto_cert_config
35
14
 
36
- # Update the app.config.hosts with the allow_identifiers if we are NOT
15
+ initializer 'auto_cert.configure_rails_initialization', after: :load_config_initializers do |app|
16
+ # Update the app.config.hosts with the server_names if we are NOT
37
17
  # in the test environment.
38
18
  #
39
19
  # In the test environment `config.hosts` is normally empty, and as a
@@ -41,10 +21,7 @@ module Anchor
41
21
  # to the `config.hosts` then HostAuthorization will be used, and tests
42
22
  # will break.
43
23
  unless Rails.env.test?
44
- # load values from ENV
45
- auto_cert_config&.validate! if Rails.configuration.auto_cert.enabled?
46
-
47
- auto_cert_config&.allow_identifiers&.each do |identifier|
24
+ app.config.auto_cert[:server_names]&.each do |identifier|
48
25
  # need to convert an identifier into a host matcher, which is just
49
26
  # strip off a leading '*' if it exists so that all subdomains match.
50
27
  #
@@ -54,42 +31,6 @@ module Anchor
54
31
  end
55
32
  end
56
33
  end
57
-
58
- def self.determine_configuration(app)
59
- auto_cert_config = app.config.auto_cert
60
-
61
- # If no configuration is set, then try to lookup one under the :anchor
62
- # key or create a default one.
63
- begin
64
- name = ENV.fetch('AUTO_CERT_NAME', 'anchor')
65
- auto_cert_config ||= ::Anchor::AutoCert::Registry.fetch(name)
66
- rescue KeyError
67
- auto_cert_config = Railtie.try_to_create_default_configuration
68
- end
69
-
70
- return nil unless auto_cert_config
71
-
72
- # Set some reasonable defaults for a scratch locations if they are not
73
- # set explicitly.
74
- acme_scratch_dir = app.root / 'tmp' / 'acme'
75
- acme_scratch_dir.mkpath
76
- auto_cert_config.cache_dir ||= (acme_scratch_dir / 'cache')
77
- auto_cert_config.work_dir ||= (acme_scratch_dir / 'work')
78
-
79
- auto_cert_config
80
- end
81
-
82
- def self.try_to_create_default_configuration
83
- name = ENV.fetch('AUTO_CERT_NAME', 'anchor')
84
- # If it doesn't exist, create a new one - now this may raise an error
85
- # if the configuration is not setup correctly
86
- ::Anchor::AutoCert::Configuration.new(name: name)
87
- rescue ConfigurationError => e
88
- # its fine to not have a configuration, just log the error and move on
89
- msg = "[AutoCert] Unable to create the '#{name}' configuration : #{e.message}"
90
- Rails.logger.error(msg)
91
- nil
92
- end
93
34
  end
94
35
  end
95
36
  end
@@ -1,21 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Anchor
4
- module AutoCert
5
- class Error < StandardError; end
6
- class IdentifierNotAllowedError < Error; end
7
- class ConfigurationError < Error; end
8
- class UnknownPolicyCheckError < Error; end
9
- class UnknownAlgorithmError < Error; end
10
- class UnknownKeyFormatError < Error; end
11
- end
12
- end
13
- require_relative 'auto_cert/terms_of_service_acceptor'
14
3
  require_relative 'auto_cert/configuration'
15
- require_relative 'auto_cert/manager'
16
- require_relative 'auto_cert/managed_certificate'
17
- require_relative 'auto_cert/identifier_policy'
18
- require_relative 'auto_cert/registry'
19
- require_relative 'auto_cert/renewal_busy_wait'
20
4
 
21
5
  require_relative 'auto_cert/railtie' if defined?(Rails::Railtie)
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'tmpdir'
4
+
3
5
  module Anchor
4
6
  # PEMBundle is a collection of PEM encoded certificates. It can be written
5
7
  # to a temporarly file on disk as a bundle if needed.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Anchor
4
- VERSION = '0.6.3'
4
+ VERSION = '0.7.0'
5
5
  end
data/lib/anchor.rb CHANGED
@@ -23,4 +23,3 @@ require_relative 'anchor/version'
23
23
  require_relative 'anchor/auto_cert'
24
24
  require_relative 'anchor/oid'
25
25
  require_relative 'anchor/pem_bundle'
26
- require_relative 'anchor/disk_store'
data/lib/puma/dsl.rb CHANGED
@@ -6,23 +6,28 @@
6
6
  #
7
7
 
8
8
  require 'puma/dsl'
9
+ require 'puma/acme/dsl'
9
10
 
10
11
  module Puma
11
12
  # Extend the ::Puma::DSL module with the configuration options we want
12
13
  class DSL
13
- def auto_cert_name(name = nil)
14
- @options[:auto_cert_name] = name if name
15
- @options[:auto_cert_name]
16
- end
17
-
18
14
  def auto_cert_port(port = nil)
19
15
  @options[:auto_cert_port] = port if port
20
16
  @options[:auto_cert_port]
21
17
  end
22
18
 
23
- def auto_cert_check_every(check_every = nil)
24
- @options[:auto_cert_check_every] = check_every if check_every
25
- @options[:auto_cert_check_every]
26
- end
19
+ alias auto_cert_algorithm acme_algorithm
20
+ alias auto_cert_cache acme_cache
21
+ alias auto_cert_cache_dir acme_cache_dir
22
+ alias auto_cert_contact acme_contact
23
+ alias auto_cert_directory acme_directory
24
+ alias auto_cert_eab_kid acme_eab_kid
25
+ alias auto_cert_eab_hmac_key acme_eab_hmac_key
26
+ alias auto_cert_mode acme_mode
27
+ alias auto_cert_renew_at acme_renew_at
28
+ alias auto_cert_renew_interval acme_renew_interval
29
+ alias auto_cert_server_name acme_server_name
30
+ alias auto_cert_server_names acme_server_names
31
+ alias auto_cert_tos_agreed acme_tos_agreed
27
32
  end
28
33
  end