net-ssh 5.1.0 → 5.2.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 +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
|