letscert 0.2.3 → 0.2.4

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: 13246f0cc94eb264f9dcc01fb55a2e55250d5e63
4
- data.tar.gz: d543f27b0a2d55a1e0fc17950bb662bbfbb3a932
3
+ metadata.gz: bc09ae0885a6a70be1512b3819c07899cd84ecab
4
+ data.tar.gz: 124c5daa4aab3d985d86a1d0fada0c65db0269a2
5
5
  SHA512:
6
- metadata.gz: ebbdc254cd7cfea90f1b23308673a839baeaa564450dc18fa5340ed30a8fa5e93e84180fdbe66360f70db449671bd276352c3a2081a5aa8b76b58604f341df7e
7
- data.tar.gz: 4ae2cdc6a2fa18eb7e9606c909e6260cee6878000ab5c601ce0482352e15333e8bd048a8b33d2614459d0c9ba36dc7c72d753936e21489a584fafb9894457720
6
+ metadata.gz: cf9e90399b2277647f72939d7669a0d562add40b1cd3a4a89346d215fe09e7a97bf0eed125342c30bed63096c92945f932276df3d82dc532a83221238cfba0e5
7
+ data.tar.gz: ce17392296e10b1d45fff709662ec3de25c53f658b28140a895706b65fe8f0f44959a87cc418d33155246af98afe36639623a503f54a77dc015d00462e1b65ff
@@ -188,11 +188,7 @@ module LetsCert
188
188
  class OpenSSLIOPlugin < IOPlugin
189
189
 
190
190
  # @private Regular expression to discriminate PEM
191
- PEM_RE = /
192
- ^-----BEGIN ((?:[\x21-\x2c\x2e-\x7e](?:[- ]?[\x21-\x2c\x2e-\x7e])*)?)\s*-----$
193
- .*?
194
- ^-----END \1-----\s*
195
- /x
191
+ PEM_RE = /^-----BEGIN CERTIFICATE-----\n.*?\n-----END CERTIFICATE-----\n/m
196
192
 
197
193
  # @param [String] name filename
198
194
  # @param [:pem,:der] type
@@ -242,10 +238,12 @@ module LetsCert
242
238
  # @param [String] data
243
239
  # @yield [String] pem
244
240
  def split_pems(data)
245
- m = data.match(PEM_RE)
241
+ my_data = data
242
+ m = my_data.match(PEM_RE)
246
243
  while (m) do
247
244
  yield m[0]
248
- m = [data[m.end(0)..-1]].match(PEM_RE)
245
+ my_data = my_data[m.end(0)..-1]
246
+ m = my_data.match(PEM_RE)
249
247
  end
250
248
  end
251
249
 
@@ -323,9 +321,11 @@ module LetsCert
323
321
  def load
324
322
  data = super
325
323
  if data[:chain].nil? or data[:chain].empty?
326
- cert, chain = nil, nil
324
+ cert = nil
325
+ chain = []
327
326
  else
328
- cert, chain = data[:chain]
327
+ cert = data[:chain].shift
328
+ chain = data[:chain]
329
329
  end
330
330
 
331
331
  { account_key: data[:account_key], key: data[:key], cert: cert, chain: chain }
data/lib/letscert.rb CHANGED
@@ -24,7 +24,7 @@
24
24
  module LetsCert
25
25
 
26
26
  # Letscert version number
27
- VERSION = '0.2.3'
27
+ VERSION = '0.2.4'
28
28
 
29
29
 
30
30
  # Base error class
data/spec/cert.der ADDED
Binary file
data/spec/cert.pem ADDED
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFmzCCBIOgAwIBAgISAVjEgN3oIZzLvwTkSOVu08NlMA0GCSqGSIb3DQEBCwUA
3
+ MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
4
+ ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTAeFw0xNjAyMTExNzQyMDBaFw0x
5
+ NjA1MTExNzQyMDBaMBIxEDAOBgNVBAMTB2xkNzcuZXUwggGiMA0GCSqGSIb3DQEB
6
+ AQUAA4IBjwAwggGKAoIBgQDPpsQCigwsWHwBhKGiXb8IDDVdV2q36tIsyP2WQmZy
7
+ G4JpasPpmVxuK2qPsYjEQRt+9VsKwOvuq1hNpQCJLtHXEweg8d4Px83WVQbcrdP5
8
+ U3hJgPbFFI6UXyx5BtsctDdYLxxi91tKn8g7nZgEGw1/NcSXkXQ6Q1/O5zwt2CME
9
+ /xGTASI74kR2nXhIU8ZPth52R99UpIYquy2n0cNyadgFuhNq+jWZ8ks+ZYY/b1s4
10
+ YL6cCx9SIAvDonrZGGG01ilZJWCxjgXxwXN5o78/22vyHcoBuwiK+6vPTKZ/+zvK
11
+ MjDXES7sM791mjgh7c+NL57SCw4D4zYq7ABmx7tCip5BGTT9n/BdoKxBK8vaU9tA
12
+ Qe3OYYXcdXN3g9up249U/+H9Hy/fu2/BYe7CDIkEU/1kQosYYKpSJv1WAU12gb77
13
+ k7u1DnR+5vP/EwA+/rLb9MvEuj8mA9oKnLVq6zOaY/LXxcVVXEJEktoDV+Y27VuU
14
+ yB5J1n7OL2SXzycj693Sk/sCAwEAAaOCAjEwggItMA4GA1UdDwEB/wQEAwIFoDAd
15
+ BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNV
16
+ HQ4EFgQUtxSm/clLMtOKm+p5seP4OsvYSFEwHwYDVR0jBBgwFoAUqEpqYwR93brm
17
+ 0Tm3pkVl7/Oo7KEwcAYIKwYBBQUHAQEEZDBiMC8GCCsGAQUFBzABhiNodHRwOi8v
18
+ b2NzcC5pbnQteDEubGV0c2VuY3J5cHQub3JnLzAvBggrBgEFBQcwAoYjaHR0cDov
19
+ L2NlcnQuaW50LXgxLmxldHNlbmNyeXB0Lm9yZy8wOwYDVR0RBDQwMoIHbGQ3Ny5l
20
+ dYIMaW1hcC5sZDc3LmV1ggxzbXRwLmxkNzcuZXWCC3d3dy5sZDc3LmV1MIH+BgNV
21
+ HSAEgfYwgfMwCAYGZ4EMAQIBMIHmBgsrBgEEAYLfEwEBATCB1jAmBggrBgEFBQcC
22
+ ARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwgasGCCsGAQUFBwICMIGeDIGb
23
+ VGhpcyBDZXJ0aWZpY2F0ZSBtYXkgb25seSBiZSByZWxpZWQgdXBvbiBieSBSZWx5
24
+ aW5nIFBhcnRpZXMgYW5kIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBDZXJ0
25
+ aWZpY2F0ZSBQb2xpY3kgZm91bmQgYXQgaHR0cHM6Ly9sZXRzZW5jcnlwdC5vcmcv
26
+ cmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAEUjrcJKy04CiIGMuJwdHUQ7
27
+ 25YywkoVxo7K8GnLs1uf5XREJgil2GPD6uL//U2V8FzreP/eDQFluNJSYE3F9F1b
28
+ f2X3TOSnJnRllFputgWMiIL8BzAbrR5UgEhrsSWS0AxK5Zh3GNTFa3pjQWu6swIl
29
+ eDAj2iJHCOuL2t33vk8G2bYdFOih0EL6WwWjrwsu4lNmjxDqKe3VOM0HJE/DBbWw
30
+ sqhZv1UOZZl8hJ6iID/hL7Tco6r1LcH5Fsyq8Yd/qbd4+kErWEvz/CeGsMDHFgYn
31
+ oefVSYJ7mA/lJTWdydeUTkdQ04H8s/pjtI8SKpMmVTQa+xdqsH2YMBEv8dspMzk=
32
+ -----END CERTIFICATE-----
data/spec/chain.pem ADDED
@@ -0,0 +1,27 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEqDCCA5CgAwIBAgIRAJgT9HUT5XULQ+dDHpceRL0wDQYJKoZIhvcNAQELBQAw
3
+ PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
4
+ Ew5EU1QgUm9vdCBDQSBYMzAeFw0xNTEwMTkyMjMzMzZaFw0yMDEwMTkyMjMzMzZa
5
+ MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
6
+ ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTCCASIwDQYJKoZIhvcNAQEBBQAD
7
+ ggEPADCCAQoCggEBAJzTDPBa5S5Ht3JdN4OzaGMw6tc1Jhkl4b2+NfFwki+3uEtB
8
+ BaupnjUIWOyxKsRohwuj43Xk5vOnYnG6eYFgH9eRmp/z0HhncchpDpWRz/7mmelg
9
+ PEjMfspNdxIknUcbWuu57B43ABycrHunBerOSuu9QeU2mLnL/W08lmjfIypCkAyG
10
+ dGfIf6WauFJhFBM/ZemCh8vb+g5W9oaJ84U/l4avsNwa72sNlRZ9xCugZbKZBDZ1
11
+ gGusSvMbkEl4L6KWTyogJSkExnTA0DHNjzE4lRa6qDO4Q/GxH8Mwf6J5MRM9LTb4
12
+ 4/zyM2q5OTHFr8SNDR1kFjOq+oQpttQLwNh9w5MCAwEAAaOCAZIwggGOMBIGA1Ud
13
+ EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMH8GCCsGAQUFBwEBBHMwcTAy
14
+ BggrBgEFBQcwAYYmaHR0cDovL2lzcmcudHJ1c3RpZC5vY3NwLmlkZW50cnVzdC5j
15
+ b20wOwYIKwYBBQUHMAKGL2h0dHA6Ly9hcHBzLmlkZW50cnVzdC5jb20vcm9vdHMv
16
+ ZHN0cm9vdGNheDMucDdjMB8GA1UdIwQYMBaAFMSnsaR7LHH62+FLkHX/xBVghYkQ
17
+ MFQGA1UdIARNMEswCAYGZ4EMAQIBMD8GCysGAQQBgt8TAQEBMDAwLgYIKwYBBQUH
18
+ AgEWImh0dHA6Ly9jcHMucm9vdC14MS5sZXRzZW5jcnlwdC5vcmcwPAYDVR0fBDUw
19
+ MzAxoC+gLYYraHR0cDovL2NybC5pZGVudHJ1c3QuY29tL0RTVFJPT1RDQVgzQ1JM
20
+ LmNybDATBgNVHR4EDDAKoQgwBoIELm1pbDAdBgNVHQ4EFgQUqEpqYwR93brm0Tm3
21
+ pkVl7/Oo7KEwDQYJKoZIhvcNAQELBQADggEBANHIIkus7+MJiZZQsY14cCoBG1hd
22
+ v0J20/FyWo5ppnfjL78S2k4s2GLRJ7iD9ZDKErndvbNFGcsW+9kKK/TnY21hp4Dd
23
+ ITv8S9ZYQ7oaoqs7HwhEMY9sibED4aXw09xrJZTC9zK1uIfW6t5dHQjuOWv+HHoW
24
+ ZnupyxpsEUlEaFb+/SCI4KCSBdAsYxAcsHYI5xxEI4LutHp6s3OT2FuO90WfdsIk
25
+ 6q78OMSdn875bNjdBYAqxUp2/LEIHfDBkLoQz0hFJmwAbYahqKaLn73PAAm1X2kj
26
+ f1w8DdnkabOLGeOVcj9LQ+s67vBykx4anTjURkbqZslUEUsn2k5xeua2zUk=
27
+ -----END CERTIFICATE-----
@@ -0,0 +1,59 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFmzCCBIOgAwIBAgISAVjEgN3oIZzLvwTkSOVu08NlMA0GCSqGSIb3DQEBCwUA
3
+ MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
4
+ ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTAeFw0xNjAyMTExNzQyMDBaFw0x
5
+ NjA1MTExNzQyMDBaMBIxEDAOBgNVBAMTB2xkNzcuZXUwggGiMA0GCSqGSIb3DQEB
6
+ AQUAA4IBjwAwggGKAoIBgQDPpsQCigwsWHwBhKGiXb8IDDVdV2q36tIsyP2WQmZy
7
+ G4JpasPpmVxuK2qPsYjEQRt+9VsKwOvuq1hNpQCJLtHXEweg8d4Px83WVQbcrdP5
8
+ U3hJgPbFFI6UXyx5BtsctDdYLxxi91tKn8g7nZgEGw1/NcSXkXQ6Q1/O5zwt2CME
9
+ /xGTASI74kR2nXhIU8ZPth52R99UpIYquy2n0cNyadgFuhNq+jWZ8ks+ZYY/b1s4
10
+ YL6cCx9SIAvDonrZGGG01ilZJWCxjgXxwXN5o78/22vyHcoBuwiK+6vPTKZ/+zvK
11
+ MjDXES7sM791mjgh7c+NL57SCw4D4zYq7ABmx7tCip5BGTT9n/BdoKxBK8vaU9tA
12
+ Qe3OYYXcdXN3g9up249U/+H9Hy/fu2/BYe7CDIkEU/1kQosYYKpSJv1WAU12gb77
13
+ k7u1DnR+5vP/EwA+/rLb9MvEuj8mA9oKnLVq6zOaY/LXxcVVXEJEktoDV+Y27VuU
14
+ yB5J1n7OL2SXzycj693Sk/sCAwEAAaOCAjEwggItMA4GA1UdDwEB/wQEAwIFoDAd
15
+ BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNV
16
+ HQ4EFgQUtxSm/clLMtOKm+p5seP4OsvYSFEwHwYDVR0jBBgwFoAUqEpqYwR93brm
17
+ 0Tm3pkVl7/Oo7KEwcAYIKwYBBQUHAQEEZDBiMC8GCCsGAQUFBzABhiNodHRwOi8v
18
+ b2NzcC5pbnQteDEubGV0c2VuY3J5cHQub3JnLzAvBggrBgEFBQcwAoYjaHR0cDov
19
+ L2NlcnQuaW50LXgxLmxldHNlbmNyeXB0Lm9yZy8wOwYDVR0RBDQwMoIHbGQ3Ny5l
20
+ dYIMaW1hcC5sZDc3LmV1ggxzbXRwLmxkNzcuZXWCC3d3dy5sZDc3LmV1MIH+BgNV
21
+ HSAEgfYwgfMwCAYGZ4EMAQIBMIHmBgsrBgEEAYLfEwEBATCB1jAmBggrBgEFBQcC
22
+ ARYaaHR0cDovL2Nwcy5sZXRzZW5jcnlwdC5vcmcwgasGCCsGAQUFBwICMIGeDIGb
23
+ VGhpcyBDZXJ0aWZpY2F0ZSBtYXkgb25seSBiZSByZWxpZWQgdXBvbiBieSBSZWx5
24
+ aW5nIFBhcnRpZXMgYW5kIG9ubHkgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBDZXJ0
25
+ aWZpY2F0ZSBQb2xpY3kgZm91bmQgYXQgaHR0cHM6Ly9sZXRzZW5jcnlwdC5vcmcv
26
+ cmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAEUjrcJKy04CiIGMuJwdHUQ7
27
+ 25YywkoVxo7K8GnLs1uf5XREJgil2GPD6uL//U2V8FzreP/eDQFluNJSYE3F9F1b
28
+ f2X3TOSnJnRllFputgWMiIL8BzAbrR5UgEhrsSWS0AxK5Zh3GNTFa3pjQWu6swIl
29
+ eDAj2iJHCOuL2t33vk8G2bYdFOih0EL6WwWjrwsu4lNmjxDqKe3VOM0HJE/DBbWw
30
+ sqhZv1UOZZl8hJ6iID/hL7Tco6r1LcH5Fsyq8Yd/qbd4+kErWEvz/CeGsMDHFgYn
31
+ oefVSYJ7mA/lJTWdydeUTkdQ04H8s/pjtI8SKpMmVTQa+xdqsH2YMBEv8dspMzk=
32
+ -----END CERTIFICATE-----
33
+ -----BEGIN CERTIFICATE-----
34
+ MIIEqDCCA5CgAwIBAgIRAJgT9HUT5XULQ+dDHpceRL0wDQYJKoZIhvcNAQELBQAw
35
+ PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
36
+ Ew5EU1QgUm9vdCBDQSBYMzAeFw0xNTEwMTkyMjMzMzZaFw0yMDEwMTkyMjMzMzZa
37
+ MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
38
+ ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTCCASIwDQYJKoZIhvcNAQEBBQAD
39
+ ggEPADCCAQoCggEBAJzTDPBa5S5Ht3JdN4OzaGMw6tc1Jhkl4b2+NfFwki+3uEtB
40
+ BaupnjUIWOyxKsRohwuj43Xk5vOnYnG6eYFgH9eRmp/z0HhncchpDpWRz/7mmelg
41
+ PEjMfspNdxIknUcbWuu57B43ABycrHunBerOSuu9QeU2mLnL/W08lmjfIypCkAyG
42
+ dGfIf6WauFJhFBM/ZemCh8vb+g5W9oaJ84U/l4avsNwa72sNlRZ9xCugZbKZBDZ1
43
+ gGusSvMbkEl4L6KWTyogJSkExnTA0DHNjzE4lRa6qDO4Q/GxH8Mwf6J5MRM9LTb4
44
+ 4/zyM2q5OTHFr8SNDR1kFjOq+oQpttQLwNh9w5MCAwEAAaOCAZIwggGOMBIGA1Ud
45
+ EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMH8GCCsGAQUFBwEBBHMwcTAy
46
+ BggrBgEFBQcwAYYmaHR0cDovL2lzcmcudHJ1c3RpZC5vY3NwLmlkZW50cnVzdC5j
47
+ b20wOwYIKwYBBQUHMAKGL2h0dHA6Ly9hcHBzLmlkZW50cnVzdC5jb20vcm9vdHMv
48
+ ZHN0cm9vdGNheDMucDdjMB8GA1UdIwQYMBaAFMSnsaR7LHH62+FLkHX/xBVghYkQ
49
+ MFQGA1UdIARNMEswCAYGZ4EMAQIBMD8GCysGAQQBgt8TAQEBMDAwLgYIKwYBBQUH
50
+ AgEWImh0dHA6Ly9jcHMucm9vdC14MS5sZXRzZW5jcnlwdC5vcmcwPAYDVR0fBDUw
51
+ MzAxoC+gLYYraHR0cDovL2NybC5pZGVudHJ1c3QuY29tL0RTVFJPT1RDQVgzQ1JM
52
+ LmNybDATBgNVHR4EDDAKoQgwBoIELm1pbDAdBgNVHQ4EFgQUqEpqYwR93brm0Tm3
53
+ pkVl7/Oo7KEwDQYJKoZIhvcNAQELBQADggEBANHIIkus7+MJiZZQsY14cCoBG1hd
54
+ v0J20/FyWo5ppnfjL78S2k4s2GLRJ7iD9ZDKErndvbNFGcsW+9kKK/TnY21hp4Dd
55
+ ITv8S9ZYQ7oaoqs7HwhEMY9sibED4aXw09xrJZTC9zK1uIfW6t5dHQjuOWv+HHoW
56
+ ZnupyxpsEUlEaFb+/SCI4KCSBdAsYxAcsHYI5xxEI4LutHp6s3OT2FuO90WfdsIk
57
+ 6q78OMSdn875bNjdBYAqxUp2/LEIHfDBkLoQz0hFJmwAbYahqKaLn73PAAm1X2kj
58
+ f1w8DdnkabOLGeOVcj9LQ+s67vBykx4anTjURkbqZslUEUsn2k5xeua2zUk=
59
+ -----END CERTIFICATE-----
@@ -61,7 +61,6 @@ module LetsCert
61
61
  describe AccountKey do
62
62
 
63
63
  before(:all) { IOPlugin.logger = Logger.new('/dev/null') }
64
-
65
64
  let(:ak) { IOPlugin.registered['account_key.json'] }
66
65
 
67
66
  it 'persist account_key' do
@@ -101,4 +100,288 @@ module LetsCert
101
100
 
102
101
  end
103
102
 
103
+ describe KeyFile do
104
+
105
+ let(:keypem) { IOPlugin.registered['key.pem'] }
106
+ let(:keyder) { IOPlugin.registered['key.der'] }
107
+
108
+ it 'persist key' do
109
+ expect(keypem.persisted[:key]).to be(true)
110
+ expect(keyder.persisted[:key]).to be(true)
111
+ end
112
+
113
+ it '#load private key from key.pem file' do
114
+ pwd = FileUtils.pwd
115
+ FileUtils.cd File.dirname(__FILE__)
116
+
117
+ begin
118
+ data = keypem.load
119
+ expect(data[:key]).to be_a(OpenSSL::PKey::RSA)
120
+ expect(data[:key].params['d']).to eq(OpenSSL::BN.new(0x573C8C0EADCBA5E571CD57FAB4D9FE6AC9DC5F9ADF8FEC48667D836B6A0EA9E1240D2A5861258A7E6E5EA1052AFAD71176A49E90BA80F43C44F2BD415161C1E71AA37E7C2BE5C7C18CF964A5A7100C801F558C7B7825D082FEF79A76963786D8CDFE1058F7F178869A09F5377F51DD45EA05B428F41F09C9F29D37BB539512C5))
121
+ rescue Exception
122
+ raise
123
+ ensure
124
+ FileUtils.cd pwd
125
+ end
126
+ end
127
+
128
+ it '#save private key to key.pem file' do
129
+ data = { key: OpenSSL::PKey::RSA.new(512) }
130
+ keypem.save data
131
+ begin
132
+ expect(File.exist? 'key.pem').to be(true)
133
+
134
+ data2 = keypem.load
135
+ expect(data2[:key].params['d'].to_i).to eq(data[:key].params['d'].to_i)
136
+ rescue Exception
137
+ raise
138
+ ensure
139
+ File.unlink 'key.pem'
140
+ end
141
+ end
142
+
143
+ it '#load private key from key.der file' do
144
+ pwd = FileUtils.pwd
145
+ FileUtils.cd File.dirname(__FILE__)
146
+
147
+ begin
148
+ data = keyder.load
149
+ expect(data[:key]).to be_a(OpenSSL::PKey::RSA)
150
+ expect(data[:key].params['d']).to eq(OpenSSL::BN.new(0x648C2A57083D12CA32A89538DD1AD7BAC5C522E682F0AFD9C834BB44CC536A57880F24D9D8987A0FC2CEF5C8F7A9BA70223E3C3E06229C815955FCE06F198175))
151
+ rescue Exception
152
+ raise
153
+ ensure
154
+ FileUtils.cd pwd
155
+ end
156
+ end
157
+
158
+ it '#save private key to key.der file' do
159
+ data = { key: OpenSSL::PKey::RSA.new(512) }
160
+ keyder.save data
161
+ begin
162
+ expect(File.exist? 'key.der').to be(true)
163
+
164
+ data2 = keyder.load
165
+ expect(data2[:key].params['d'].to_i).to eq(data[:key].params['d'].to_i)
166
+ rescue Exception
167
+ raise
168
+ ensure
169
+ File.unlink 'key.der'
170
+ end
171
+ end
172
+ end
173
+
174
+ describe ChainFile do
175
+ let(:chain) { IOPlugin.registered['chain.pem'] }
176
+
177
+ it 'persist chain' do
178
+ expect(chain.persisted[:chain]).to be(true)
179
+ end
180
+
181
+ it '#load chain from chain.pem file' do
182
+ pwd = FileUtils.pwd
183
+ FileUtils.cd File.dirname(__FILE__)
184
+
185
+ begin
186
+ data = chain.load
187
+ expect(data[:cert]).to be_nil
188
+ expect(data[:chain]).to_not be_nil
189
+ expect(data[:chain]).to be_a(Array)
190
+ expect(data[:chain].first).to be_a(OpenSSL::X509::Certificate)
191
+ rescue Exception
192
+ raise
193
+ ensure
194
+ FileUtils.cd pwd
195
+ end
196
+ end
197
+
198
+ it '#save chain to chain.pem file' do
199
+ pwd = FileUtils.pwd
200
+ FileUtils.cd File.dirname(__FILE__)
201
+
202
+ begin
203
+ data = chain.load
204
+ expect(data[:cert]).to be_nil
205
+ expect(data[:chain]).to_not be_nil
206
+ rescue Exception
207
+ raise
208
+ ensure
209
+ FileUtils.cd pwd
210
+ end
211
+
212
+ chain.save data
213
+
214
+ begin
215
+ expect(File.exist? 'chain.pem').to be(true)
216
+
217
+ data2 = chain.load
218
+ data2[:chain].each_with_index do |cert, i|
219
+ expect(cert.to_pem).to eq(data[:chain][i].to_pem)
220
+ end
221
+ rescue Exception
222
+ raise
223
+ ensure
224
+ File.unlink 'chain.pem'
225
+ end
226
+ end
227
+
228
+ end
229
+
230
+ describe FullChainFile do
231
+ let(:fullchain) { IOPlugin.registered['fullchain.pem'] }
232
+
233
+ it 'persist chain' do
234
+ expect(fullchain.persisted[:chain]).to be(true)
235
+ end
236
+
237
+ it 'persist cert' do
238
+ expect(fullchain.persisted[:cert]).to be(true)
239
+ end
240
+
241
+ it '#load cert and chain from fullchain.pem file' do
242
+ pwd = FileUtils.pwd
243
+ FileUtils.cd File.dirname(__FILE__)
244
+
245
+ begin
246
+ data = fullchain.load
247
+ expect(data[:cert]).to_not be_nil
248
+ expect(data[:cert]).to be_a(OpenSSL::X509::Certificate)
249
+ expect(data[:chain]).to_not be_nil
250
+ expect(data[:chain]).to be_a(Array)
251
+ expect(data[:chain].first).to be_a(OpenSSL::X509::Certificate)
252
+ rescue Exception
253
+ raise
254
+ ensure
255
+ FileUtils.cd pwd
256
+ end
257
+ end
258
+
259
+ it '#save cert and chain to fullchain.pem file' do
260
+ pwd = FileUtils.pwd
261
+ FileUtils.cd File.dirname(__FILE__)
262
+
263
+ begin
264
+ data = fullchain.load
265
+ expect(data[:cert]).to_not be_nil
266
+ expect(data[:chain]).to_not be_nil
267
+ rescue Exception
268
+ raise
269
+ ensure
270
+ FileUtils.cd pwd
271
+ end
272
+
273
+ fullchain.save data
274
+
275
+ begin
276
+ expect(File.exist? 'fullchain.pem').to be(true)
277
+
278
+ data2 = fullchain.load
279
+ expect(data2[:cert].to_pem).to eq(data[:cert].to_pem)
280
+ data2[:chain].each_with_index do |cert, i|
281
+ expect(cert.to_pem).to eq(data[:chain][i].to_pem)
282
+ end
283
+ rescue Exception
284
+ raise
285
+ ensure
286
+ File.unlink 'fullchain.pem'
287
+ end
288
+ end
289
+
290
+ end
291
+
292
+ describe CertFile do
293
+
294
+ let(:certpem) { IOPlugin.registered['cert.pem'] }
295
+ let(:certder) { IOPlugin.registered['cert.der'] }
296
+
297
+ it 'persist cert' do
298
+ expect(certpem.persisted[:cert]).to be(true)
299
+ expect(certder.persisted[:cert]).to be(true)
300
+ end
301
+
302
+ it '#load cert from cert.pem' do
303
+ pwd = FileUtils.pwd
304
+ FileUtils.cd File.dirname(__FILE__)
305
+
306
+ begin
307
+ data = certpem.load
308
+ expect(data[:cert]).to_not be_nil
309
+ expect(data[:cert]).to be_a(OpenSSL::X509::Certificate)
310
+ rescue Exception
311
+ raise
312
+ ensure
313
+ FileUtils.cd pwd
314
+ end
315
+ end
316
+
317
+ it '#load cert from cert.der' do
318
+ pwd = FileUtils.pwd
319
+ FileUtils.cd File.dirname(__FILE__)
320
+
321
+ begin
322
+ data = certder.load
323
+ expect(data[:cert]).to_not be_nil
324
+ expect(data[:cert]).to be_a(OpenSSL::X509::Certificate)
325
+ rescue Exception
326
+ raise
327
+ ensure
328
+ FileUtils.cd pwd
329
+ end
330
+ end
331
+
332
+ it '#save cert to cert.pem' do
333
+ pwd = FileUtils.pwd
334
+ FileUtils.cd File.dirname(__FILE__)
335
+
336
+ begin
337
+ data = certpem.load
338
+ expect(data[:cert]).to_not be_nil
339
+ rescue Exception
340
+ raise
341
+ ensure
342
+ FileUtils.cd pwd
343
+ end
344
+
345
+ certpem.save data
346
+
347
+ begin
348
+ expect(File.exist? 'cert.pem').to be(true)
349
+
350
+ data2 = certpem.load
351
+ expect(data2[:cert].to_pem).to eq(data[:cert].to_pem)
352
+ rescue Exception
353
+ raise
354
+ ensure
355
+ File.unlink 'cert.pem'
356
+ end
357
+ end
358
+
359
+ it '#save cert to cert.der' do
360
+ pwd = FileUtils.pwd
361
+ FileUtils.cd File.dirname(__FILE__)
362
+
363
+ begin
364
+ data = certder.load
365
+ expect(data[:cert]).to_not be_nil
366
+ rescue Exception
367
+ raise
368
+ ensure
369
+ FileUtils.cd pwd
370
+ end
371
+
372
+ certder.save data
373
+
374
+ begin
375
+ expect(File.exist? 'cert.der').to be(true)
376
+
377
+ data2 = certder.load
378
+ expect(data2[:cert].to_pem).to eq(data[:cert].to_pem)
379
+ rescue Exception
380
+ raise
381
+ ensure
382
+ File.unlink 'cert.der'
383
+ end
384
+ end
385
+ end
386
+
104
387
  end
data/spec/key.der ADDED
Binary file
data/spec/key.pem ADDED
@@ -0,0 +1,15 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIICXQIBAAKBgQCcUtDEgi7FE8IO5NINg6qNmxm4XBw24GYMCfPz+InzGu1naMoQ
3
+ Up83B9qlNJpNKj7MnaRFePWnEgS9JbUxEYPoUB6zRDnabgzABsy4Tcrg6F3LXsHG
4
+ T72QZfU/fInLr+Ib4qE+oJ8jpQY6zRb1/SMXEcPFF5zSLzT3IEYNrAgUoQIDAQAB
5
+ AoGAVzyMDq3LpeVxzVf6tNn+asncX5rfj+xIZn2Da2oOqeEkDSpYYSWKfm5eoQUq
6
+ +tcRdqSekLqA9DxE8r1BUWHB5xqjfnwr5cfBjPlkpacQDIAfVYx7eCXQgv73mnaW
7
+ N4bYzf4QWPfxeIaaCfU3f1HdReoFtCj0HwnJ8p03u1OVEsUCQQDQIUQZN9KyTv6B
8
+ EBc50RNjeUxz13Ivjn8lWX95yf2VFfFRbS9hwOzsDl3jNtWqEtoePZsqdjwHlbMI
9
+ ovfls/rTAkEAwEcs2u2+07EflbLkbmEF/5zJQXdslKd8Cx6Xp/jtyO09sPj9Jjnb
10
+ h6pWXRLHgn8JsojX6ALPpqOGpryKBgXiOwJBAMMwT4Mu/SRIPRqhEocgcwR5P5/s
11
+ T6QWCVvnwUtgibcFqxloQmV03zzKhHaQeHVV1MVDlX+O/uFGHW9eFwqPbg0CQQCA
12
+ aojgpsw+IhvQJSw/M/mHoDUhzhrspXdJDeOHwc891ITRP1oDP70IvJD1lGc/Fo1p
13
+ ec+JGueIicqSbXVZVHClAkBW8wwSK/QBG9eAkWH9i2WCJb3okYsmRoSwDAYIsnMO
14
+ GOn1TJ8b7rorKE6S3G1v+jQSXFx6Pc+HU+weS7Ux8UIV
15
+ -----END RSA PRIVATE KEY-----
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: letscert
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Daubert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-11 00:00:00.000000000 Z
11
+ date: 2016-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: acme-client
@@ -65,23 +65,23 @@ files:
65
65
  - README.md
66
66
  - Rakefile
67
67
  - bin/letscert
68
- - bin/letscert~
69
68
  - lib/letscert.rb
70
- - lib/letscert.rb~
71
69
  - lib/letscert/certificate.rb
72
70
  - lib/letscert/io_plugin.rb
73
71
  - lib/letscert/loggable.rb
74
72
  - lib/letscert/runner.rb
75
73
  - spec/account_key.json
74
+ - spec/cert.der
75
+ - spec/cert.pem
76
+ - spec/chain.pem
77
+ - spec/fullchain.pem
76
78
  - spec/io_plugin_spec.rb
77
- - spec/io_plugin_spec.rb~
79
+ - spec/key.der
80
+ - spec/key.pem
78
81
  - spec/loggable_spec.rb
79
- - spec/loggable_spec.rb~
80
82
  - spec/spec_helper.rb
81
- - spec/spec_helper.rb~
82
83
  - spec/test.json
83
84
  - tasks/gem.rake
84
- - tasks/gem.rake~
85
85
  - tasks/spec.rake
86
86
  - tasks/yard.rake
87
87
  homepage: https://github.com/sdaubert/letscert
data/bin/letscert~ DELETED
@@ -1,4 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require 'acme-client'
4
-
data/lib/letscert.rb~ DELETED
@@ -1,6 +0,0 @@
1
- module LetsCert
2
-
3
- # Letscert version number
4
- VERSION = '0.0.1'
5
-
6
- end
@@ -1,16 +0,0 @@
1
- require_relative 'spec_helper'
2
-
3
- module LetsCert
4
-
5
- describe IOPlugin do
6
-
7
- it '.empty_data always returns the same hash' do
8
- hsh = IOPlugin.empty_data
9
-
10
- expect(hsh.keys.size).to eq(4)
11
- expect(hsh.keys).to include(:account_key)
12
- end
13
-
14
- end
15
-
16
- end
@@ -1 +0,0 @@
1
- require_relative 'spec_helper'
data/spec/spec_helper.rb~ DELETED
@@ -1 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
data/tasks/gem.rake~ DELETED
@@ -1,34 +0,0 @@
1
- require 'rubygems/package_task'
2
- require_relative '../lib/letscert.rb'
3
-
4
- spec = Gem::Specification.new do |s|
5
- s.name = 'letscert'
6
- s.version = LetsCert::VERSION
7
- s.summary = "letscert, a simple Let's Encrypt client"
8
- s.description = <<-EOF
9
- letscert is a simple Let's Encrypt client written in Ruby. It aims at be as clean as
10
- simp_le.
11
- EOF
12
-
13
- s.authors << 'Sylvain Daubert'
14
- s.email = 'sylvain.daubert@laposte.net'
15
- s.homepage = 'https://github.com/sdaubert/letscert'
16
-
17
- files = Dir['{spec,lib,bin,tasks}/**/*']
18
- files += ['README.md', 'MIT-LICENSE', 'Rakefile']
19
- # For now, device is not in gem.
20
- s.files = files
21
- s.executables = ['letscert']
22
-
23
- s.add_dependency 'acme-client', '~>0.2.4'
24
- s.add_dependency 'yard', '~>0.8.7'
25
-
26
- #s.add_development_dependency 'rspec', '~>2.14.0'
27
- end
28
-
29
-
30
- Gem::PackageTask.new(spec) do |pkg|
31
- pkg.need_zip = true
32
- pkg.need_tar = true
33
- end
34
- ~