letscert 0.5.0 → 0.6.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
  SHA1:
3
- metadata.gz: 52add53a57fa00b0778f2a493f17f60c52c66420
4
- data.tar.gz: 918a0428e5ec2c2c7f05c29eb41fcd60cd43a5f6
3
+ metadata.gz: 510c269bc1fe51684e676d4b566f03535f5d8a58
4
+ data.tar.gz: 241b3100db0e5bf7682273adceed0a6ed164bb4a
5
5
  SHA512:
6
- metadata.gz: 7a5017b39b842d751148c95666fc2372c4af7158c2dada7ad5b5d4dd6e53fe1d38582090827271611fc7ddb94c1e8c8473f0ed6837f855e3c66eedca38b544b4
7
- data.tar.gz: 9c9462d83f3b2fecba4c0d3ef73760257d4814df0aeb8aafeb177f096e34fec2ed896f8cea923b37ed358592c1b345ca8de1cd03c93b6f43df0dc44647502987
6
+ metadata.gz: f14a0d228cd125277d4c55df41417e62d761492496b5cd02bc43a2c333f8c47329206c39a1bd579030059601da6c40c0aac8701f2b148642c766c90e8e18bedc
7
+ data.tar.gz: be1d7083454b4e65580e6de083e020ee7705ac59a652fe6c44cea85f5ab3195a634576597bcd0ddc28825848c3c1816b703e3f25ab6643addd3811567a387051
Binary file
data.tar.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -26,8 +26,11 @@ letscert -d example.org:/var/www/example.org/html --email my.name@example.org \
26
26
  -f account_key.json -f key.pem -f cert.pem -f chain.pem
27
27
  ```
28
28
 
29
- Commands are the sames for certificate renewal.
29
+ Theses commands generate RSA certificates, using a RSA account key. To generate ECDSA
30
+ keys and certificates, use `--cert-ecdsa CURVE` (CURVE: `prime256v1` or `sec384r1`)
31
+ and/or `--account-key-type ecdsa` options.
30
32
 
33
+ Commands are the sames for certificate renewal.
31
34
 
32
35
  ## Generate a key pair and get a signed certificate for multi-domains:
33
36
  Generate a single certificate for `example.org` and `www.example.org`:
@@ -23,7 +23,7 @@ EOF
23
23
 
24
24
  s.required_ruby_version = '>= 2.1.0'
25
25
 
26
- s.add_dependency 'acme-client', '~>0.5.5'
26
+ s.add_dependency 'acme-client', '~>0.6.1'
27
27
 
28
28
  s.add_development_dependency 'bundler', '~> 1.12'
29
29
  s.add_development_dependency 'rake', '~> 11.0'
@@ -50,7 +50,7 @@ module LetsCert
50
50
  # @param [OpenSSL::PKey::PKey,nil] account_key private key to
51
51
  # authenticate to ACME server
52
52
  # @param [OpenSSL::PKey::PKey, nil] key private key from which make a
53
- # certificate. If +nil+, generate a new one with +options[:cet_key_size]+
53
+ # certificate. If +nil+, generate a new one with +options[:cert_key_size]+
54
54
  # bits.
55
55
  # @param [Hash] options option hash
56
56
  # @option options [Fixnum] :account_key_size ACME account private key size
@@ -72,6 +72,9 @@ module LetsCert
72
72
  check_roots(options[:roots])
73
73
  logger.debug { "webroots are: #{options[:roots].inspect}" }
74
74
 
75
+ account_key = get_account_key(account_key, options[:account_key_type],
76
+ options[:account_key_size])
77
+
75
78
  client = get_acme_client(account_key, options)
76
79
 
77
80
  do_challenges client, options[:roots]
@@ -88,7 +91,7 @@ module LetsCert
88
91
 
89
92
  options[:files] ||= []
90
93
  options[:files].each do |plugname|
91
- IOPlugin.registered[plugname].save(account_key: client.private_key,
94
+ IOPlugin.registered[plugname].save(account_key: account_key,
92
95
  key: pkey, cert: @cert,
93
96
  chain: @chain)
94
97
  end
@@ -157,10 +160,8 @@ module LetsCert
157
160
  def get_acme_client(account_key, options)
158
161
  return @client if @client
159
162
 
160
- key = get_account_key(account_key, options[:account_key_size])
161
-
162
163
  logger.debug { "connect to #{options[:server]}" }
163
- @client = Acme::Client.new(private_key: key, endpoint: options[:server])
164
+ @client = Acme::Client.new(private_key: account_key, endpoint: options[:server])
164
165
 
165
166
  yield @client if block_given?
166
167
 
@@ -212,12 +213,28 @@ module LetsCert
212
213
 
213
214
  # Generate a new account key if no one is given in +data+
214
215
  # @param [OpenSSL::PKey,nil] key
216
+ # @param [String] key_type +'rsa'+ or +'ecdsa'+
215
217
  # @param [Integer] key_size
216
218
  # @return [OpenSSL::PKey::PKey]
217
- def get_account_key(key, key_size)
219
+ def get_account_key(key, key_type, key_size)
218
220
  if key.nil?
219
221
  logger.info { 'No account key. Generate a new one...' }
220
- OpenSSL::PKey::RSA.new(key_size)
222
+ case key_type
223
+ when 'rsa'
224
+ OpenSSL::PKey::RSA.new key_size
225
+ when 'ecdsa'
226
+ curve = case key_size
227
+ when 256
228
+ 'prime256v1'
229
+ when 384
230
+ 'secp384r1'
231
+ else
232
+ raise Error, 'ECDSA account key size: only 256 or 384 bits'
233
+ end
234
+ generate_ecdsa_key curve
235
+ else
236
+ raise Error, "unsupported '#{key_type}' account key type"
237
+ end
221
238
  else
222
239
  key
223
240
  end
@@ -313,8 +330,10 @@ module LetsCert
313
330
  end
314
331
 
315
332
  if options[:cert_ecdsa]
333
+ logger.debug { "generate a #{options[:cert_ecdsa]}-bit ECDSA private key" }
316
334
  generate_ecdsa_key options[:cert_ecdsa]
317
335
  else
336
+ logger.debug { "generate a #{options[:cert_rsa]}-bit RSA private key" }
318
337
  OpenSSL::PKey::RSA.generate options[:cert_rsa]
319
338
  end
320
339
  end
@@ -351,8 +370,10 @@ module LetsCert
351
370
  # @param [OpenSSL::PKey::PKey] pkey private key to use
352
371
  # @return [OpenSSL::PKey::PKey] +pkey+
353
372
  def generate_certificate_from_pkey(domains, pkey)
373
+ logger.debug { 'generate certificate request' }
354
374
  csr = Acme::Client::CertificateRequest.new(names: domains,
355
375
  private_key: pkey)
376
+ logger.debug { 'requesting certificate...' }
356
377
  acme_cert = client.new_certificate(csr)
357
378
  @cert = acme_cert.x509
358
379
  @chain = acme_cert.x509_chain
@@ -45,6 +45,12 @@ module LetsCert
45
45
  # Default key size for RSA certificates
46
46
  RSA_DEFAULT_KEY_SIZE = 2048
47
47
 
48
+ # Default account key size for RSA type
49
+ RSA_DEFAULT_ACCOUNT_KEY_SIZE = 4096
50
+
51
+ # Default account key size for ECDSA type
52
+ ECDSA_DEFAULT_ACCOUNT_KEY_SIZE = 384
53
+
48
54
  # Get options
49
55
  # @return [Hash]
50
56
  attr_reader :options
@@ -66,7 +72,7 @@ module LetsCert
66
72
  domains: [],
67
73
  files: [],
68
74
  valid_min: ValidTime.new('30d'),
69
- account_key_size: 4096,
75
+ account_key_type: 'rsa',
70
76
  tos_sha256: '33d233c8ab558ba6c8ebc370a509acdded8b80e5d587aa5d192193f3' \
71
77
  '5226540f',
72
78
  server: 'https://acme-v01.api.letsencrypt.org/directory'
@@ -188,9 +194,16 @@ module LetsCert
188
194
  ' specified by --server')
189
195
  opts.separator('')
190
196
 
197
+ opts.on('--account-key-type TYPE', %w(rsa ecdsa),
198
+ 'Account key type: rsa or ecdsa',
199
+ '(Defaul: rsa)') do |type|
200
+ @options[:account_key_type] = type
201
+ end
202
+
191
203
  opts.on('--account-key-size BITS', Integer,
192
204
  'Account key size (default: ' \
193
- "#{@options[:account_key_size]})") do |bits|
205
+ "#{RSA_DEFAULT_ACCOUNT_KEY_SIZE} (RSA) or ",
206
+ "#{ECDSA_DEFAULT_ACCOUNT_KEY_SIZE} (ECDSA))") do |bits|
194
207
  @options[:account_key_size] = bits
195
208
  end
196
209
 
@@ -221,6 +234,7 @@ module LetsCert
221
234
  @opt_parser.parse!
222
235
  compute_roots
223
236
  select_default_cert_type_if_none_specified
237
+ select_default_account_key_size_if_none_specified
224
238
  end
225
239
 
226
240
  # Check all components are covered by plugins
@@ -374,6 +388,15 @@ module LetsCert
374
388
  end
375
389
  end
376
390
 
391
+ def select_default_account_key_size_if_none_specified
392
+ case @options[:account_key_type]
393
+ when 'rsa'
394
+ @options[:account_key_size] ||= RSA_DEFAULT_ACCOUNT_KEY_SIZE
395
+ when 'ecdsa'
396
+ @options[:account_key_size] ||= ECDSA_DEFAULT_ACCOUNT_KEY_SIZE
397
+ end
398
+ end
399
+
377
400
  def persisted_data
378
401
  persisted = IOPlugin.empty_data
379
402
  @options[:files].each do |file|
@@ -1,6 +1,6 @@
1
1
  module LetsCert
2
2
 
3
3
  # Letscert version number
4
- VERSION = '0.5.0'.freeze
4
+ VERSION = '0.6.0'.freeze
5
5
 
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: letscert
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Daubert
@@ -31,7 +31,7 @@ cert_chain:
31
31
  dMi8WSKt03lfzyxIqZseBwVYYn+XMlzCcJLXCUgZXHcBRRRDH5wGDqOqXjL25b2O
32
32
  6m3JJngqkCFrOw==
33
33
  -----END CERTIFICATE-----
34
- date: 2017-04-18 00:00:00.000000000 Z
34
+ date: 2017-06-03 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: acme-client
@@ -39,14 +39,14 @@ dependencies:
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: 0.5.5
42
+ version: 0.6.1
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: 0.5.5
49
+ version: 0.6.1
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: bundler
52
52
  requirement: !ruby/object:Gem::Requirement
metadata.gz.sig CHANGED
Binary file