acme-client 2.0.4 → 2.0.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
- SHA1:
3
- metadata.gz: 54ec1f6479ae9ad3e2cbf8c5986a10c320f357c8
4
- data.tar.gz: df0f59c9c338dc51dc695be84a463af71c839476
2
+ SHA256:
3
+ metadata.gz: bdf3dcbcbe410b8843976b06e849045be1cec4515b771d2cad99bf49d2dc206d
4
+ data.tar.gz: 52b8a373c8f8135abffe75e04d581a0b7800cfb4fab23662bfc68c81ce4b8626
5
5
  SHA512:
6
- metadata.gz: d8f1abedad59da56d0703c142db46c87467cda2fe7612c638f83ca9a6b77029b783d8eea8231b04c99094495b70164efda1ca03be08be28eb70cb5ca20b15de2
7
- data.tar.gz: e6913ac5eda13275adcd2638e04d96c23a6c13083dc4e70c7956236e03a1d7d4aca22c2f388c6fc4917987dfb42ca828c27d605f2cb856ed3117e73d2b25e21d
6
+ metadata.gz: ce77c7466d8c625f043831425e4a0a6563d4ff667e6abb4280c43de00e2aa037caf5802bc56ce229f33707009d5bf76ee979b3f8161cb2dbf91ccf37c5ce8be5
7
+ data.tar.gz: 44a2290c512cea8cc8b89b42b983d14c1fba80d94dd663eed4c83877f3f5d407f1ec69a6e8d29fe205b8c5a0f6d43a2403d26d5514fd9cef99c691bbc244103f
data/.gitignore CHANGED
@@ -9,3 +9,4 @@
9
9
  /tmp/
10
10
  /vendor/bundle
11
11
  /.idea/
12
+ .tool-versions
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## `2.0.5`
2
+
3
+ * Use post-as-get
4
+ * Remove deprecated keyAuthorization
5
+
1
6
  ## `2.0.4`
2
7
 
3
8
  * Add an option to retry bad nonce errors
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/unixcharles/acme-client.svg?branch=master)](https://travis-ci.org/unixcharles/acme-client)
4
4
 
5
- `acme-client` is a client implementation of the [ACMEv2](https://github.com/ietf-wg-acme/acme) protocol in Ruby.
5
+ `acme-client` is a client implementation of the ACMEv2 / [RFC 8555](https://tools.ietf.org/html/rfc8555) protocol in Ruby.
6
6
 
7
7
  You can find the ACME reference implementations of the [server](https://github.com/letsencrypt/boulder) in Go and the [client](https://github.com/certbot/certbot) in Python.
8
8
 
data/acme-client.gemspec CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.add_development_dependency 'rake', '~> 10.0'
21
21
  spec.add_development_dependency 'rspec', '~> 3.3', '>= 3.3.0'
22
22
  spec.add_development_dependency 'vcr', '~> 2.9', '>= 2.9.3'
23
- spec.add_development_dependency 'webmock', '~> 1.21', '>= 1.21.0'
23
+ spec.add_development_dependency 'webmock', '~> 3.3'
24
24
 
25
25
  spec.add_runtime_dependency 'faraday', '~> 0.9', '>= 0.9.1'
26
26
  end
data/lib/acme/client.rb CHANGED
@@ -90,7 +90,7 @@ class Acme::Client
90
90
  response.headers.fetch(:location)
91
91
  end
92
92
 
93
- response = post(@kid)
93
+ response = post_as_get(@kid)
94
94
  arguments = attributes_from_account_response(response)
95
95
  Acme::Client::Resources::Account.new(self, url: @kid, **arguments)
96
96
  end
@@ -101,13 +101,7 @@ class Acme::Client
101
101
 
102
102
  def new_order(identifiers:, not_before: nil, not_after: nil)
103
103
  payload = {}
104
- payload['identifiers'] = if identifiers.is_a?(Hash)
105
- identifiers
106
- else
107
- Array(identifiers).map do |identifier|
108
- { type: 'dns', value: identifier }
109
- end
110
- end
104
+ payload['identifiers'] = prepare_order_identifiers(identifiers)
111
105
  payload['notBefore'] = not_before if not_before
112
106
  payload['notAfter'] = not_after if not_after
113
107
 
@@ -117,7 +111,7 @@ class Acme::Client
117
111
  end
118
112
 
119
113
  def order(url:)
120
- response = get(url)
114
+ response = post_as_get(url)
121
115
  arguments = attributes_from_order_response(response)
122
116
  Acme::Client::Resources::Order.new(self, **arguments.merge(url: url))
123
117
  end
@@ -139,7 +133,7 @@ class Acme::Client
139
133
  end
140
134
 
141
135
  def authorization(url:)
142
- response = get(url)
136
+ response = post_as_get(url)
143
137
  arguments = attributes_from_authorization_response(response)
144
138
  Acme::Client::Resources::Authorization.new(self, url: url, **arguments)
145
139
  end
@@ -151,13 +145,13 @@ class Acme::Client
151
145
  end
152
146
 
153
147
  def challenge(url:)
154
- response = get(url)
148
+ response = post_as_get(url)
155
149
  arguments = attributes_from_challenge_response(response)
156
150
  Acme::Client::Resources::Challenges.new(self, **arguments)
157
151
  end
158
152
 
159
- def request_challenge_validation(url:, key_authorization:)
160
- response = post(url, payload: { keyAuthorization: key_authorization })
153
+ def request_challenge_validation(url:, key_authorization: nil)
154
+ response = post(url, payload: {})
161
155
  arguments = attributes_from_challenge_response(response)
162
156
  Acme::Client::Resources::Challenges.new(self, **arguments)
163
157
  end
@@ -206,6 +200,20 @@ class Acme::Client
206
200
 
207
201
  private
208
202
 
203
+ def prepare_order_identifiers(identifiers)
204
+ if identifiers.is_a?(Hash)
205
+ [identifiers]
206
+ else
207
+ Array(identifiers).map do |identifier|
208
+ if identifier.is_a?(String)
209
+ { type: 'dns', value: identifier }
210
+ else
211
+ identifier
212
+ end
213
+ end
214
+ end
215
+ end
216
+
209
217
  def attributes_from_account_response(response)
210
218
  extract_attributes(
211
219
  response.body,
@@ -252,14 +260,19 @@ class Acme::Client
252
260
  connection.post(url, payload)
253
261
  end
254
262
 
263
+ def post_as_get(url, mode: :kid)
264
+ connection = connection_for(url: url, mode: mode)
265
+ connection.post(url, nil)
266
+ end
267
+
255
268
  def get(url, mode: :kid)
256
269
  connection = connection_for(url: url, mode: mode)
257
270
  connection.get(url)
258
271
  end
259
272
 
260
273
  def download(url, format:)
261
- connection = connection_for(url: url, mode: :download)
262
- connection.get do |request|
274
+ connection = connection_for(url: url, mode: :kid)
275
+ connection.post do |request|
263
276
  request.url(url)
264
277
  request.headers['Accept'] = CONTENT_TYPES.fetch(format)
265
278
  end
@@ -14,10 +14,10 @@ class Acme::Client::JWK::Base
14
14
  # payload - A Hash of payload data.
15
15
  #
16
16
  # Returns a JSON String.
17
- def jws(header: {}, payload: {})
17
+ def jws(header: {}, payload:)
18
18
  header = jws_header(header)
19
19
  encoded_header = Acme::Client::Util.urlsafe_base64(header.to_json)
20
- encoded_payload = Acme::Client::Util.urlsafe_base64(payload.to_json)
20
+ encoded_payload = Acme::Client::Util.urlsafe_base64(payload.nil? ? '' : payload.to_json)
21
21
 
22
22
  signature_data = "#{encoded_header}.#{encoded_payload}"
23
23
  signature = sign(signature_data)
@@ -4,6 +4,7 @@ module Acme::Client::Resources::Challenges
4
4
  require 'acme/client/resources/challenges/base'
5
5
  require 'acme/client/resources/challenges/http01'
6
6
  require 'acme/client/resources/challenges/dns01'
7
+ require 'acme/client/resources/challenges/unsupported_challenge'
7
8
 
8
9
  CHALLENGE_TYPES = {
9
10
  'http-01' => Acme::Client::Resources::Challenges::HTTP01,
@@ -11,11 +12,6 @@ module Acme::Client::Resources::Challenges
11
12
  }
12
13
 
13
14
  def self.new(client, type:, **arguments)
14
- klass = CHALLENGE_TYPES[type]
15
- if klass
16
- klass.new(client, **arguments)
17
- else
18
- { type: type }.merge(arguments)
19
- end
15
+ CHALLENGE_TYPES.fetch(type, Unsupported).new(client, **arguments)
20
16
  end
21
17
  end
@@ -21,17 +21,9 @@ class Acme::Client::Resources::Challenges::Base
21
21
  true
22
22
  end
23
23
 
24
- def send_challenge_vallidation(url:, key_authorization:)
25
- @client.request_challenge_validation(
26
- url: url,
27
- key_authorization: key_authorization
28
- ).to_h
29
- end
30
-
31
24
  def request_validation
32
- assign_attributes(**send_challenge_vallidation(
33
- url: url,
34
- key_authorization: key_authorization
25
+ assign_attributes(**send_challenge_validation(
26
+ url: url
35
27
  ))
36
28
  true
37
29
  end
@@ -42,6 +34,12 @@ class Acme::Client::Resources::Challenges::Base
42
34
 
43
35
  private
44
36
 
37
+ def send_challenge_validation(url:)
38
+ @client.request_challenge_validation(
39
+ url: url
40
+ ).to_h
41
+ end
42
+
45
43
  def assign_attributes(status:, url:, token:, error: nil)
46
44
  @status = status
47
45
  @url = url
@@ -0,0 +1,2 @@
1
+ class Acme::Client::Resources::Challenges::Unsupported < Acme::Client::Resources::Challenges::Base
2
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Acme
4
4
  class Client
5
- VERSION = '2.0.4'.freeze
5
+ VERSION = '2.0.5'.freeze
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acme-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 2.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Barbier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-29 00:00:00.000000000 Z
11
+ date: 2019-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -48,22 +48,22 @@ dependencies:
48
48
  name: rspec
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '3.3'
54
51
  - - ">="
55
52
  - !ruby/object:Gem::Version
56
53
  version: 3.3.0
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '3.3'
57
57
  type: :development
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - "~>"
62
- - !ruby/object:Gem::Version
63
- version: '3.3'
64
61
  - - ">="
65
62
  - !ruby/object:Gem::Version
66
63
  version: 3.3.0
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '3.3'
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: vcr
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -90,20 +90,14 @@ dependencies:
90
90
  requirements:
91
91
  - - "~>"
92
92
  - !ruby/object:Gem::Version
93
- version: '1.21'
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: 1.21.0
93
+ version: '3.3'
97
94
  type: :development
98
95
  prerelease: false
99
96
  version_requirements: !ruby/object:Gem::Requirement
100
97
  requirements:
101
98
  - - "~>"
102
99
  - !ruby/object:Gem::Version
103
- version: '1.21'
104
- - - ">="
105
- - !ruby/object:Gem::Version
106
- version: 1.21.0
100
+ version: '3.3'
107
101
  - !ruby/object:Gem::Dependency
108
102
  name: faraday
109
103
  requirement: !ruby/object:Gem::Requirement
@@ -161,6 +155,7 @@ files:
161
155
  - lib/acme/client/resources/challenges/base.rb
162
156
  - lib/acme/client/resources/challenges/dns01.rb
163
157
  - lib/acme/client/resources/challenges/http01.rb
158
+ - lib/acme/client/resources/challenges/unsupported_challenge.rb
164
159
  - lib/acme/client/resources/directory.rb
165
160
  - lib/acme/client/resources/order.rb
166
161
  - lib/acme/client/self_sign_certificate.rb
@@ -185,8 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
180
  - !ruby/object:Gem::Version
186
181
  version: '0'
187
182
  requirements: []
188
- rubyforge_project:
189
- rubygems_version: 2.5.2.3
183
+ rubygems_version: 3.0.3
190
184
  signing_key:
191
185
  specification_version: 4
192
186
  summary: Client for the ACME protocol.