letscert 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
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
- ~