net-ssh 5.1.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.rubocop.yml +3 -0
- data/CHANGES.txt +17 -1
- data/lib/net/ssh/authentication/ed25519.rb +12 -1
- data/lib/net/ssh/config.rb +3 -1
- data/lib/net/ssh/key_factory.rb +98 -9
- data/lib/net/ssh/known_hosts.rb +23 -6
- data/lib/net/ssh/transport/session.rb +1 -1
- data/lib/net/ssh/version.rb +1 -1
- data/lib/net/ssh.rb +5 -1
- data/net-ssh-public_cert.pem +18 -19
- data.tar.gz.sig +0 -0
- metadata +20 -21
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bb9cafa5bb69001f6ac6c303a18369ea759d93a
|
4
|
+
data.tar.gz: d2cb338177e2ce3abc7755c4b5e3f163048a56e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c3a4b65a0ac623b3567d04d79f50cf081286dd4aa74ea0f97fae2edb1f3c70bb470b9511c18530c241e5ad4956828df434f12d29655e11e8f934992aeb0d13e
|
7
|
+
data.tar.gz: c69a452a092f2f3077db5b7c6249e20b143fe9161f53b078f99375e45f815b04d716cf4bee53447ba28189126cc889db423891f4fb1e3d1a5f965f5bdc484c7f
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/.rubocop.yml
CHANGED
data/CHANGES.txt
CHANGED
@@ -1,8 +1,24 @@
|
|
1
|
+
=== 5.2.0.rc3
|
2
|
+
|
3
|
+
* Fix check_host_ip read from config
|
4
|
+
* Support ssh-ed25519 in kown hosts
|
5
|
+
|
6
|
+
=== 5.2.0.rc2
|
7
|
+
|
8
|
+
* Read check_host_ip from ssh config files
|
9
|
+
|
10
|
+
=== 5.2.0.rc1
|
11
|
+
|
12
|
+
* Interpret * and ? in know_hosts file [Romain Tartière, #660]
|
13
|
+
* New :check_host_ip so ip checking can be disabled in known hosts [Romain Tartière, #656]
|
14
|
+
|
15
|
+
=== 5.1.0
|
16
|
+
|
1
17
|
=== 5.1.0.rc1
|
2
18
|
|
3
19
|
* Support new OpenSSH private key format for rsa - bcrypt for rsa (ed25519 already supported) [#646]
|
4
20
|
* Support IdentityAgent is ssh config [Frank Groeneveld, #645]
|
5
|
-
* Improve Match
|
21
|
+
* Improve Match processing in ssh config [Aleksandrs Ļedovskis, #642]
|
6
22
|
* Ignore signature verification when verify_host_key is never [Piotr Kliczewski, #641]
|
7
23
|
* Alg preference was changed to prefer stronger encryptions [Tray, #637]
|
8
24
|
|
@@ -29,6 +29,17 @@ module Net
|
|
29
29
|
MEND = "-----END OPENSSH PRIVATE KEY-----\n"
|
30
30
|
MAGIC = "openssh-key-v1"
|
31
31
|
|
32
|
+
class DecryptError < ArgumentError
|
33
|
+
def initialize(message, encrypted_key: false)
|
34
|
+
super(message)
|
35
|
+
@encrypted_key = encrypted_key
|
36
|
+
end
|
37
|
+
|
38
|
+
def encrypted_key?
|
39
|
+
return @encrypted_key
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
32
43
|
def self.read(datafull, password)
|
33
44
|
raise ArgumentError.new("Expected #{MBEGIN} at start of private key") unless datafull.start_with?(MBEGIN)
|
34
45
|
raise ArgumentError.new("Expected #{MEND} at end of private key") unless datafull.end_with?(MEND)
|
@@ -74,7 +85,7 @@ module Net
|
|
74
85
|
check1 = decoded.read_long
|
75
86
|
check2 = decoded.read_long
|
76
87
|
|
77
|
-
raise
|
88
|
+
raise DecryptError.new("Decrypt failed on private key", encrypted_key: kdfname == 'bcrypt') if (check1 != check2)
|
78
89
|
|
79
90
|
type_name = decoded.read_string
|
80
91
|
case type_name
|
data/lib/net/ssh/config.rb
CHANGED
@@ -24,6 +24,7 @@ module Net
|
|
24
24
|
# * IdentityFile => maps to the :keys option
|
25
25
|
# * IdentityAgent => :identity_agent
|
26
26
|
# * IdentitiesOnly => :keys_only
|
27
|
+
# * CheckHostIP => :check_host_ip
|
27
28
|
# * Macs => maps to the :hmac option
|
28
29
|
# * PasswordAuthentication => maps to the :auth_methods option password
|
29
30
|
# * Port => :port
|
@@ -202,7 +203,8 @@ module Net
|
|
202
203
|
fingerprinthash: :fingerprint_hash,
|
203
204
|
port: :port,
|
204
205
|
user: :user,
|
205
|
-
userknownhostsfile: :user_known_hosts_file
|
206
|
+
userknownhostsfile: :user_known_hosts_file,
|
207
|
+
checkhostip: :check_host_ip
|
206
208
|
}
|
207
209
|
case key
|
208
210
|
when :ciphers
|
data/lib/net/ssh/key_factory.rb
CHANGED
@@ -50,16 +50,17 @@ module Net
|
|
50
50
|
# encrypted (requiring a passphrase to use), the user will be
|
51
51
|
# prompted to enter their password unless passphrase works.
|
52
52
|
def load_data_private_key(data, passphrase=nil, ask_passphrase=true, filename="", prompt=Prompt.default)
|
53
|
-
|
53
|
+
key_type = classify_key(data, filename)
|
54
54
|
|
55
|
-
encrypted_key =
|
55
|
+
encrypted_key = nil
|
56
56
|
tries = 0
|
57
57
|
|
58
58
|
prompter = nil
|
59
59
|
result =
|
60
60
|
begin
|
61
|
-
|
62
|
-
rescue *error_classes
|
61
|
+
key_type.read(data, passphrase || 'invalid')
|
62
|
+
rescue *key_type.error_classes => e
|
63
|
+
encrypted_key = !!key_type.encrypted_key?(data, e) if encrypted_key.nil?
|
63
64
|
if encrypted_key && ask_passphrase
|
64
65
|
tries += 1
|
65
66
|
if tries <= 3
|
@@ -106,20 +107,108 @@ module Net
|
|
106
107
|
|
107
108
|
private
|
108
109
|
|
110
|
+
# rubocop:disable Style/Documentation, Lint/DuplicateMethods
|
111
|
+
class KeyType
|
112
|
+
def self.read(key_data, passphrase)
|
113
|
+
raise Exception, "TODO subclasses should implement read"
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.error_classes
|
117
|
+
raise Exception, "TODO subclasses should implement read"
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.encrypted_key?(data, error)
|
121
|
+
raise Exception, "TODO subclasses should implement is_encrypted_key"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
class OpenSSHPrivateKeyType < KeyType
|
126
|
+
def self.read(key_data, passphrase)
|
127
|
+
Net::SSH::Authentication::ED25519::OpenSSHPrivateKeyLoader.read(key_data, passphrase)
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.error_classes
|
131
|
+
[Net::SSH::Authentication::ED25519::OpenSSHPrivateKeyLoader::DecryptError]
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.encrypted_key?(key_data, decode_error)
|
135
|
+
decode_error.is_a?(Net::SSH::Authentication::ED25519::OpenSSHPrivateKeyLoader::DecryptError) && decode_error.encrypted_key?
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
class OpenSSLKeyTypeBase < KeyType
|
140
|
+
def self.open_ssl_class
|
141
|
+
raise Exception, "TODO: subclasses should implement"
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.read(key_data, passphrase)
|
145
|
+
open_ssl_class.new(key_data, passphrase)
|
146
|
+
end
|
147
|
+
|
148
|
+
def self.encrypted_key?(key_data, error)
|
149
|
+
key_data.match(/ENCRYPTED/)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
class OpenSSLPKeyType < OpenSSLKeyTypeBase
|
154
|
+
def self.read(key_data, passphrase)
|
155
|
+
open_ssl_class.read(key_data, passphrase)
|
156
|
+
end
|
157
|
+
|
158
|
+
def self.open_ssl_class
|
159
|
+
OpenSSL::PKey
|
160
|
+
end
|
161
|
+
|
162
|
+
def self.error_classes
|
163
|
+
[ArgumentError, OpenSSL::PKey::PKeyError]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
class OpenSSLDSAKeyType < OpenSSLKeyTypeBase
|
168
|
+
def self.open_ssl_class
|
169
|
+
OpenSSL::PKey::DSA
|
170
|
+
end
|
171
|
+
|
172
|
+
def self.error_classes
|
173
|
+
[OpenSSL::PKey::DSAError]
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
class OpenSSLRSAKeyType < OpenSSLKeyTypeBase
|
178
|
+
def self.open_ssl_class
|
179
|
+
OpenSSL::PKey::RSA
|
180
|
+
end
|
181
|
+
|
182
|
+
def self.error_classes
|
183
|
+
[OpenSSL::PKey::RSAError]
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
class OpenSSLECKeyType < OpenSSLKeyTypeBase
|
188
|
+
def self.open_ssl_class
|
189
|
+
OpenSSL::PKey::EC
|
190
|
+
end
|
191
|
+
|
192
|
+
def self.error_classes
|
193
|
+
[OpenSSL::PKey::ECError]
|
194
|
+
end
|
195
|
+
end
|
196
|
+
# rubocop:enable Style/Documentation, Lint/DuplicateMethods
|
197
|
+
|
109
198
|
# Determine whether the file describes an RSA or DSA key, and return how load it
|
110
199
|
# appropriately.
|
111
200
|
def classify_key(data, filename)
|
112
201
|
if data.match(/-----BEGIN OPENSSH PRIVATE KEY-----/)
|
113
202
|
Net::SSH::Authentication::ED25519Loader.raiseUnlessLoaded("OpenSSH keys only supported if ED25519 is available")
|
114
|
-
return
|
203
|
+
return OpenSSHPrivateKeyType
|
115
204
|
elsif OpenSSL::PKey.respond_to?(:read)
|
116
|
-
return
|
205
|
+
return OpenSSLPKeyType
|
117
206
|
elsif data.match(/-----BEGIN DSA PRIVATE KEY-----/)
|
118
|
-
return
|
207
|
+
return OpenSSLDSAKeyType
|
119
208
|
elsif data.match(/-----BEGIN RSA PRIVATE KEY-----/)
|
120
|
-
return
|
209
|
+
return OpenSSLRSAKeyType
|
121
210
|
elsif data.match(/-----BEGIN EC PRIVATE KEY-----/) && defined?(OpenSSL::PKey::EC)
|
122
|
-
return
|
211
|
+
return OpenSSLECKeyType
|
123
212
|
elsif data.match(/-----BEGIN (.+) PRIVATE KEY-----/)
|
124
213
|
raise OpenSSL::PKey::PKeyError, "not a supported key type '#{$1}'"
|
125
214
|
else
|
data/lib/net/ssh/known_hosts.rb
CHANGED
@@ -2,6 +2,7 @@ require 'strscan'
|
|
2
2
|
require 'openssl'
|
3
3
|
require 'base64'
|
4
4
|
require 'net/ssh/buffer'
|
5
|
+
require 'net/ssh/authentication/ed25519_loader'
|
5
6
|
|
6
7
|
module Net
|
7
8
|
module SSH
|
@@ -48,18 +49,19 @@ module Net
|
|
48
49
|
else
|
49
50
|
SUPPORTED_TYPE = %w[ssh-rsa ssh-dss]
|
50
51
|
end
|
52
|
+
SUPPORTED_TYPE.push('ssh-ed25519') if Net::SSH::Authentication::ED25519Loader::LOADED
|
51
53
|
|
52
54
|
class <<self
|
53
55
|
# Searches all known host files (see KnownHosts.hostfiles) for all keys
|
54
56
|
# of the given host. Returns an enumerable of keys found.
|
55
57
|
def search_for(host, options={})
|
56
|
-
HostKeys.new(search_in(hostfiles(options), host), host, self, options)
|
58
|
+
HostKeys.new(search_in(hostfiles(options), host, options), host, self, options)
|
57
59
|
end
|
58
60
|
|
59
61
|
# Search for all known keys for the given host, in every file given in
|
60
62
|
# the +files+ array. Returns the list of keys.
|
61
|
-
def search_in(files, host)
|
62
|
-
files.flat_map { |file| KnownHosts.new(file).keys_for(host) }
|
63
|
+
def search_in(files, host, options = {})
|
64
|
+
files.flat_map { |file| KnownHosts.new(file).keys_for(host, options) }
|
63
65
|
end
|
64
66
|
|
65
67
|
# Looks in the given +options+ hash for the :user_known_hosts_file and
|
@@ -119,11 +121,13 @@ module Net
|
|
119
121
|
# "[net.ssh.test]:5555"
|
120
122
|
# "[1,2,3,4]:5555"
|
121
123
|
# "[net.ssh.test]:5555,[1.2.3.4]:5555
|
122
|
-
def keys_for(host)
|
124
|
+
def keys_for(host, options = {})
|
123
125
|
keys = []
|
124
126
|
return keys unless File.readable?(source)
|
125
127
|
|
126
128
|
entries = host.split(/,/)
|
129
|
+
host_name = entries[0]
|
130
|
+
host_ip = entries[1]
|
127
131
|
|
128
132
|
File.open(source) do |file|
|
129
133
|
scanner = StringScanner.new("")
|
@@ -134,8 +138,10 @@ module Net
|
|
134
138
|
next if scanner.match?(/$|#/)
|
135
139
|
|
136
140
|
hostlist = scanner.scan(/\S+/).split(/,/)
|
137
|
-
found =
|
138
|
-
|
141
|
+
found = hostlist.any? { |pattern| match(host_name, pattern) } || known_host_hash?(hostlist, entries)
|
142
|
+
next unless found
|
143
|
+
|
144
|
+
found = hostlist.include?(host_ip) if options[:check_host_ip] && entries.size > 1 && hostlist.size > 1
|
139
145
|
next unless found
|
140
146
|
|
141
147
|
scanner.skip(/\s*/)
|
@@ -152,6 +158,17 @@ module Net
|
|
152
158
|
keys
|
153
159
|
end
|
154
160
|
|
161
|
+
def match(host, pattern)
|
162
|
+
# see man 8 sshd for pattern details
|
163
|
+
pattern_regexp = pattern.split('*').map do |x|
|
164
|
+
x.split('?').map do |y|
|
165
|
+
Regexp.escape(y)
|
166
|
+
end.join('.')
|
167
|
+
end.join('[^.]*')
|
168
|
+
|
169
|
+
host =~ Regexp.new("\\A#{pattern_regexp}\\z")
|
170
|
+
end
|
171
|
+
|
155
172
|
# Indicates whether one of the entries matches an hostname that has been
|
156
173
|
# stored as a HMAC-SHA1 hash in the known hosts.
|
157
174
|
def known_host_hash?(hostlist, entries)
|
data/lib/net/ssh/version.rb
CHANGED
data/lib/net/ssh.rb
CHANGED
@@ -73,7 +73,7 @@ module Net
|
|
73
73
|
max_win_size send_env use_agent number_of_password_prompts
|
74
74
|
append_all_supported_algorithms non_interactive password_prompt
|
75
75
|
agent_socket_factory minimum_dh_bits verify_host_key
|
76
|
-
fingerprint_hash
|
76
|
+
fingerprint_hash check_host_ip
|
77
77
|
]
|
78
78
|
|
79
79
|
# The standard means of starting a new SSH connection. When used with a
|
@@ -108,6 +108,8 @@ module Net
|
|
108
108
|
# * :bind_address => the IP address on the connecting machine to use in
|
109
109
|
# establishing connection. (:bind_address is discarded if :proxy
|
110
110
|
# is set.)
|
111
|
+
# * :check_host_ip => Also ckeck IP address when connecting to remote host.
|
112
|
+
# Defaults to +true+.
|
111
113
|
# * :compression => the compression algorithm to use, or +true+ to use
|
112
114
|
# whatever is supported.
|
113
115
|
# * :compression_level => the compression level to use when sending data
|
@@ -221,6 +223,8 @@ module Net
|
|
221
223
|
options = configuration_for(host, options.fetch(:config, true)).merge(options)
|
222
224
|
host = options.fetch(:host_name, host)
|
223
225
|
|
226
|
+
options[:check_host_ip] = true unless options.key?(:check_host_ip)
|
227
|
+
|
224
228
|
if options[:non_interactive]
|
225
229
|
options[:number_of_password_prompts] = 0
|
226
230
|
end
|
data/net-ssh-public_cert.pem
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
9OGohJvAFzcvhDTWPwT6w3PG5B80pqb9j1hEAg==
|
2
|
+
MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpuZXRz
|
3
|
+
c2gvREM9c29sdXRpb3VzL0RDPWNvbTAeFw0xOTAzMTEwOTQ1MzZaFw0yMDAzMTAw
|
4
|
+
OTQ1MzZaMCUxIzAhBgNVBAMMGm5ldHNzaC9EQz1zb2x1dGlvdXMvREM9Y29tMIIB
|
5
|
+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxieE22fR/qmdPKUHyYTyUx2g
|
6
|
+
wskLwrCkxay+Tvc97ZZUOwf85LDDDPqhQaTWLvRwnIOMgQE2nBPzwalVclK6a+pW
|
7
|
+
x/18KDeZY15vm3Qn5p42b0wi9hUxOqPm3J2hdCLCcgtENgdX21nVzejn39WVqFJO
|
8
|
+
lntgSDNW5+kCS8QaRsmIbzj17GKKkrsw39kiQw7FhWfJFeTjddzoZiWwc59KA/Bx
|
9
|
+
fBbmDnsMLAtAtauMOxORrbx3EOY7sHku/kSrMg3FXFay7jc6BkbbUij+MjJ/k82l
|
10
|
+
4o8o0YO4BAnya90xgEmgOG0LCCxRhuXQFnMDuDjK2XnUe0h4/6NCn94C+z9GsQID
|
11
|
+
AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUBfKiwO2e
|
12
|
+
M4NEiRrVG793qEPLYyMwHwYDVR0RBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20w
|
13
|
+
HwYDVR0SBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20wDQYJKoZIhvcNAQELBQAD
|
14
|
+
ggEBAILNXrrFaLruwlBoTx3F7iL5wiRUT+cOMfdon25gzX8Tf87hi6rITnRgFfak
|
15
|
+
w+C/rbrYOuEfUJMeZSU5ASxzrB4ohgJ5AFxuxGNkWEQJC4nICGn3ML8PmHzEV12z
|
16
|
+
+nMm9AtBM16dJTdTKA2B6du0ZtTtbm4M3ULB7rhkUO2L2RbDyyiGQw85IBdaVdzr
|
17
|
+
GmrxZPAOhBABOREsvJU1+3GIyJncqXmtrYUGUoLiIf/WO0mxPzYALZC/6ZYfu2UP
|
18
|
+
+MqVFjDxsJA7cDfACke51RypSH1gZoPjzoW6w0sMRAzZT8hU1eGyqtNuBiSZ1UKv
|
19
|
+
B/ztNLEP0OWhpj/NZ1fnGRvo/T0=
|
21
20
|
-----END CERTIFICATE-----
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-ssh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamis Buck
|
@@ -12,27 +12,26 @@ bindir: exe
|
|
12
12
|
cert_chain:
|
13
13
|
- |
|
14
14
|
-----BEGIN CERTIFICATE-----
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
9OGohJvAFzcvhDTWPwT6w3PG5B80pqb9j1hEAg==
|
15
|
+
MIIDQDCCAiigAwIBAgIBATANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpuZXRz
|
16
|
+
c2gvREM9c29sdXRpb3VzL0RDPWNvbTAeFw0xOTAzMTEwOTQ1MzZaFw0yMDAzMTAw
|
17
|
+
OTQ1MzZaMCUxIzAhBgNVBAMMGm5ldHNzaC9EQz1zb2x1dGlvdXMvREM9Y29tMIIB
|
18
|
+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxieE22fR/qmdPKUHyYTyUx2g
|
19
|
+
wskLwrCkxay+Tvc97ZZUOwf85LDDDPqhQaTWLvRwnIOMgQE2nBPzwalVclK6a+pW
|
20
|
+
x/18KDeZY15vm3Qn5p42b0wi9hUxOqPm3J2hdCLCcgtENgdX21nVzejn39WVqFJO
|
21
|
+
lntgSDNW5+kCS8QaRsmIbzj17GKKkrsw39kiQw7FhWfJFeTjddzoZiWwc59KA/Bx
|
22
|
+
fBbmDnsMLAtAtauMOxORrbx3EOY7sHku/kSrMg3FXFay7jc6BkbbUij+MjJ/k82l
|
23
|
+
4o8o0YO4BAnya90xgEmgOG0LCCxRhuXQFnMDuDjK2XnUe0h4/6NCn94C+z9GsQID
|
24
|
+
AQABo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUBfKiwO2e
|
25
|
+
M4NEiRrVG793qEPLYyMwHwYDVR0RBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20w
|
26
|
+
HwYDVR0SBBgwFoEUbmV0c3NoQHNvbHV0aW91cy5jb20wDQYJKoZIhvcNAQELBQAD
|
27
|
+
ggEBAILNXrrFaLruwlBoTx3F7iL5wiRUT+cOMfdon25gzX8Tf87hi6rITnRgFfak
|
28
|
+
w+C/rbrYOuEfUJMeZSU5ASxzrB4ohgJ5AFxuxGNkWEQJC4nICGn3ML8PmHzEV12z
|
29
|
+
+nMm9AtBM16dJTdTKA2B6du0ZtTtbm4M3ULB7rhkUO2L2RbDyyiGQw85IBdaVdzr
|
30
|
+
GmrxZPAOhBABOREsvJU1+3GIyJncqXmtrYUGUoLiIf/WO0mxPzYALZC/6ZYfu2UP
|
31
|
+
+MqVFjDxsJA7cDfACke51RypSH1gZoPjzoW6w0sMRAzZT8hU1eGyqtNuBiSZ1UKv
|
32
|
+
B/ztNLEP0OWhpj/NZ1fnGRvo/T0=
|
34
33
|
-----END CERTIFICATE-----
|
35
|
-
date:
|
34
|
+
date: 2019-03-11 00:00:00.000000000 Z
|
36
35
|
dependencies:
|
37
36
|
- !ruby/object:Gem::Dependency
|
38
37
|
name: bcrypt_pbkdf
|
metadata.gz.sig
CHANGED
Binary file
|