vagrant-certificates 2.0.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 +7 -0
- data/.github/CONTRIBUTING.md +8 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +7 -0
- data/LICENSE +22 -0
- data/README.md +132 -0
- data/Rakefile +1 -0
- data/bin/rspec +17 -0
- data/certs/jbellone.pem +32 -0
- data/lib/vagrant-certificates/action/install_certificates.rb +114 -0
- data/lib/vagrant-certificates/cap/coreos/certificate_file_bundle.rb +13 -0
- data/lib/vagrant-certificates/cap/coreos/certificate_upload_path.rb +13 -0
- data/lib/vagrant-certificates/cap/coreos/update_certificate_bundle.rb +20 -0
- data/lib/vagrant-certificates/cap/debian/certificate_file_bundle.rb +13 -0
- data/lib/vagrant-certificates/cap/debian/certificate_upload_path.rb +13 -0
- data/lib/vagrant-certificates/cap/debian/update_certificate_bundle.rb +20 -0
- data/lib/vagrant-certificates/cap/redhat/certificate_file_bundle.rb +13 -0
- data/lib/vagrant-certificates/cap/redhat/certificate_upload_path.rb +18 -0
- data/lib/vagrant-certificates/cap/redhat/helpers.rb +15 -0
- data/lib/vagrant-certificates/cap/redhat/update_certificate_bundle.rb +38 -0
- data/lib/vagrant-certificates/cap/windows/certificate_file_bundle.rb +13 -0
- data/lib/vagrant-certificates/cap/windows/certificate_upload_path.rb +13 -0
- data/lib/vagrant-certificates/cap/windows/update_certificate_bundle.rb +19 -0
- data/lib/vagrant-certificates/config.rb +45 -0
- data/lib/vagrant-certificates/plugin.rb +88 -0
- data/lib/vagrant-certificates/version.rb +5 -0
- data/lib/vagrant-certificates.rb +2 -0
- data/locales/en.yml +17 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/unit/vagrant-certificates/action/install_certificates_spec.rb +5 -0
- data/spec/unit/vagrant-certificates/cap/coreos/certificate_upload_path_spec.rb +5 -0
- data/spec/unit/vagrant-certificates/cap/coreos/update_certificate_bundle_spec.rb +5 -0
- data/spec/unit/vagrant-certificates/cap/debian/certificate_upload_path_spec.rb +5 -0
- data/spec/unit/vagrant-certificates/cap/debian/update_certificate_bundle_spec.rb +5 -0
- data/spec/unit/vagrant-certificates/cap/redhat/certificate_upload_path_spec.rb +5 -0
- data/spec/unit/vagrant-certificates/cap/redhat/update_certificate_bundle_spec.rb +5 -0
- data/spec/unit/vagrant-certificates/cap/windows/certificate_upload_path_spec.rb +5 -0
- data/spec/unit/vagrant-certificates/cap/windows/update_certificate_bundle_spec.rb +5 -0
- data/spec/unit/vagrant-certificates/config_spec.rb +5 -0
- data/vagrant-certificates.gemspec +28 -0
- metadata +116 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 939f3ba91b87bf52ab5ee0d9afcb889a0790e5ac95e63fbd0f3cca8ccdc30b1f
|
4
|
+
data.tar.gz: f8887f558673672a53eb1f682c8b18e61e1f62f59ffe9e76139865114e473930
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 68d0108732000c906e4a8a5bb9e2aa00d567c753b81ed2135d3eafe078e8449e109b52db9efdfa129fcd50dca56014da6830fd3abb1cc66d001594dc8aa8b5bf
|
7
|
+
data.tar.gz: 4f41431da09c45f956e877488fc0b7671e9670f8dc1c2e60802846e70552e949e4a5ba6a3857df0fbbbb39764a3a8c59b194e9a691bd61d6e4973b5c31ecc7ee
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
# Changelog
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
5
|
+
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
6
|
+
|
7
|
+
## [1.3.0] 2017-09-25
|
8
|
+
- Adds support for managing Windows guest certificates.
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright 2019, GFI Informatique.
|
4
|
+
Copyright 2014-2017, Bloomberg Finance L.P.
|
5
|
+
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
8
|
+
in the Software without restriction, including without limitation the rights
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
11
|
+
furnished to do so, subject to the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
14
|
+
copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
22
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
# CA Certificate Plugin for Vagrant
|
2
|
+

|
3
|
+

|
4
|
+
|
5
|
+
A [Vagrant][4] plugin which configures the virtual machine to inject
|
6
|
+
the specified certificates into the guest's root bundle. This is
|
7
|
+
useful, for example, if your enterprise network has a firewall (or
|
8
|
+
appliance) which utilizes [SSL interception][5].
|
9
|
+
|
10
|
+
_Warning:_ This plugin adds certificates to the guest operating
|
11
|
+
system's [root certificate bundle][6]. You should only use this if you
|
12
|
+
know *exactly* what you are doing. This should *never* be used on a
|
13
|
+
production machine.
|
14
|
+
|
15
|
+
## Fork
|
16
|
+
|
17
|
+
This is a fork of original [vagrant-ca-certificates](https://github.com/williambailey/vagrant-ca-certificates) plugin.
|
18
|
+
|
19
|
+
## Installation
|
20
|
+
The latest stable version of this plugin can be installed using the
|
21
|
+
standard `vagrant plugin install` with the `vagrant-certificates`
|
22
|
+
argument. If you're looking to hack on the plugin or test a
|
23
|
+
development release you'll need to checkout the branch and build the
|
24
|
+
gem yourself. That's pretty easy.
|
25
|
+
|
26
|
+
The following set of commands checks out the master branch, uses
|
27
|
+
bundler to install all of the Ruby dependencies and finally creates
|
28
|
+
the gem locally. Once the gem is built we use the Vagrant command-line
|
29
|
+
tool to install it.
|
30
|
+
```sh
|
31
|
+
git clone https://github.com/williambailey/vagrant-certificates ~/Projects/vagrant-certificates
|
32
|
+
cd ~/Projects/vagrant-certificates
|
33
|
+
bundle install
|
34
|
+
rake build
|
35
|
+
vagrant plugin install pkg/vagrant-certificates-*.gem
|
36
|
+
```
|
37
|
+
|
38
|
+
## Using with Test Kitchen
|
39
|
+
### Writing a Vagrantfile.rb
|
40
|
+
In order to be able to use [test kitchen][2] within an environment that
|
41
|
+
has a HTTP proxy with SSL interception we need to ensure that we set
|
42
|
+
both the proxies and inject in our new certificate bundles.
|
43
|
+
|
44
|
+
If you're following the complete tutorial here we're going to save
|
45
|
+
this file in a newly created directory
|
46
|
+
`~/.vagrant.d/Vagrantfile`. This will be merged into the final
|
47
|
+
Vagrantfile configuration that the test-kitchen run will use to
|
48
|
+
provision a new instance.
|
49
|
+
```ruby
|
50
|
+
Vagrant.configure('2') do |config|
|
51
|
+
config.proxy.enabled = true if Vagrant.has_plugin?('vagrant-proxyconf')
|
52
|
+
|
53
|
+
if Vagrant.has_plugin?('vagrant-certificates')
|
54
|
+
config.certificates.enabled = true
|
55
|
+
config.certificates.certs = [
|
56
|
+
'/etc/pki/ca-trust/source/anchors/root.crt',
|
57
|
+
'/etc/pki/ca-trust/source/anchors/sub.crt'
|
58
|
+
]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
```
|
62
|
+
### Writing a .kitchen.local.yml
|
63
|
+
One goal that we set out when creating internal cookbooks is if that
|
64
|
+
they can be open sourced we want to be easily able to do so in the
|
65
|
+
future. That means we try to keep out as much of our environment
|
66
|
+
specific variables, such as proxy configuration, from the repository's
|
67
|
+
base kitchen configuration. Luckily test-kitchen merges in a local
|
68
|
+
file, if it exists, at the time of the run.
|
69
|
+
|
70
|
+
Here is an example of the local configuration file that we use to
|
71
|
+
merge in the Vagrantfile that we've created in the above example. This
|
72
|
+
can be saved into `$HOME/.kitchen/config.yml` to be applied to *all*
|
73
|
+
test-kitchen runs for this user (on this host machine).
|
74
|
+
```yaml
|
75
|
+
---
|
76
|
+
driver:
|
77
|
+
provision: true
|
78
|
+
http_proxy: "http://proxy.corporate.com:80"
|
79
|
+
https_proxy: "http://proxy.corporate.com:80"
|
80
|
+
ftp_proxy: "http://proxy.corporate.com:80"
|
81
|
+
no_proxy: "localhost,127.0.0.1"
|
82
|
+
```
|
83
|
+
|
84
|
+
## Vagrant Configuration
|
85
|
+
If you're just looking to inject the certificate *only for a single
|
86
|
+
Vagrantfile* then you can simply use the following block anywhere
|
87
|
+
within the Vagrant configuration. This enables the plugin and injects
|
88
|
+
the specified certificates.
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
Vagrant.configure('2') do |config|
|
92
|
+
if Vagrant.has_plugin?('vagrant-certificates')
|
93
|
+
config.certificates.enabled = true
|
94
|
+
config.certificates.certs = Dir.glob('/etc/pki/ca-trust/source/anchors/*.crt')
|
95
|
+
end
|
96
|
+
end
|
97
|
+
```
|
98
|
+
### System Wide
|
99
|
+
At [Bloomberg][1] we often find ourselves in a situation where we do
|
100
|
+
not want to make modifications to open source tools, but we need them
|
101
|
+
to work within our enterprise network. Using this default base configuration
|
102
|
+
for Vagrant we're able to ensure that all runs will inject the appropriate
|
103
|
+
certificates into the guest.
|
104
|
+
|
105
|
+
Additionally if you need proxies modified in the guest as well an
|
106
|
+
excellent choice is the [Vagrant Proxyconf plugin][2] which should
|
107
|
+
handle everything you'll run into on a daily basis. Finally, we add the
|
108
|
+
[Vagrant cachier plugin][7] so that we are not continually going out to the Internet
|
109
|
+
on successive [Test Kitchen][3] and Vagrant runs.
|
110
|
+
|
111
|
+
This file should be saved to `$HOME/.kitchen/Vagrantfile.rb`.
|
112
|
+
```ruby
|
113
|
+
# These are requirements for this base Vagrantfile. If they are not
|
114
|
+
# installed there will be a warning message with Vagrant/test-kitchen.
|
115
|
+
%w(vagrant-certificates vagrant-proxyconf vagrant-cachier).each do |name|
|
116
|
+
fail "Please install the '#{name}' plugin!" unless Vagrant.has_plugin?(name)
|
117
|
+
end
|
118
|
+
|
119
|
+
Vagrant.configure('2') do |config|
|
120
|
+
config.cache.scope = :box
|
121
|
+
config.proxy.enabled = true
|
122
|
+
config.certificates.enabled = true
|
123
|
+
config.certificates.certs = Dir.glob('/etc/pki/ca-trust/source/anchors/*.crt')
|
124
|
+
end
|
125
|
+
```
|
126
|
+
[1]: https://careers.bloomberg.com
|
127
|
+
[2]: https://github.com/tmatilai/vagrant-proxyconf
|
128
|
+
[3]: https://github.com/test-kitchen/test-kitchen
|
129
|
+
[4]: https://github.com/mitchellh/vagrant
|
130
|
+
[5]: http://en.wikipedia.org/wiki/Man-in-the-middle_attack
|
131
|
+
[6]: http://en.wikipedia.org/wiki/Root_certificate
|
132
|
+
[7]: https://github.com/fgrehm/vagrant-cachier
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/bin/rspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'rspec' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require "pathname"
|
11
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require "rubygems"
|
15
|
+
require "bundler/setup"
|
16
|
+
|
17
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/certs/jbellone.pem
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIFgDCCA2igAwIBAgIBATANBgkqhkiG9w0BAQUFADBDMREwDwYDVQQDDAhqYmVs
|
3
|
+
bG9uZTEZMBcGCgmSJomT8ixkARkWCWJsb29tYmVyZzETMBEGCgmSJomT8ixkARkW
|
4
|
+
A25ldDAeFw0xNzA5MjUxMjA0NDVaFw0xODA5MjUxMjA0NDVaMEMxETAPBgNVBAMM
|
5
|
+
CGpiZWxsb25lMRkwFwYKCZImiZPyLGQBGRYJYmxvb21iZXJnMRMwEQYKCZImiZPy
|
6
|
+
LGQBGRYDbmV0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzRdyupn5
|
7
|
+
5gpXivhSDi+lnepuxf4ila+9FDW5znNxbwDLFsfzYFiPecJFLylWyHtJSe9fq8gW
|
8
|
+
1G1qWU6wCaw4Jw6fU9wdh+g4GMRdcbbH6EJPNJjV3Z0/E0XAXOzC1AHUpYc/o0Wq
|
9
|
+
wS/MmfPHuZnH9IPS0moWDoifKBrNIyPBMRxNTkDnOMo/FtvFmLIN8f0PWF4RW0yr
|
10
|
+
KthpgcvpulUZImZEplKYTeGe3P3OmfiddWao5VNbuB/srTcW/yTuHT3lV5jsqMF9
|
11
|
+
lvw3jdUfHcZLagKP8xpBnrS/mlfGgA0cnIrdaDFOaJVGZFpCOd1+usen4EmsT6mN
|
12
|
+
X5+m7fmvm+aHu8frEsiBG3k5WT+0rHnBIRbdobpLbjcxeFOxa99JXId0fTUiwCOG
|
13
|
+
MrZnI/ItsqlxqMXy4RKpTwoB9Ypgejs6FDJA0DH8czJTQ4Y1ePXjgF3VVyXFNxn+
|
14
|
+
NeV3s8DF4wgRrLeJb4+kTFZzigp/6IEBgwUKdBOJ5Su1APMsBHNeR2xcY3OMme1Y
|
15
|
+
yjq2//uAUZ4CUlhgJzRiHSkuYz9iFJcBUU4QlpRTOwsroeOibEzIoykcoWLEYCAA
|
16
|
+
57Gc6myaOt18RElJDoGp3N7HkBBBV5ojfyTWVkNKLlaA9AV+Vvvdw39pH2VylQpz
|
17
|
+
sZVuQwW8HYG8smqtxAa3CGnavEnA/rE5HrUCAwEAAaN/MH0wCQYDVR0TBAIwADAL
|
18
|
+
BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFNMsCmYsjoVDz/Jma5XJFyXB+5FzMCEGA1Ud
|
19
|
+
EQQaMBiBFmpiZWxsb25lQGJsb29tYmVyZy5uZXQwIQYDVR0SBBowGIEWamJlbGxv
|
20
|
+
bmVAYmxvb21iZXJnLm5ldDANBgkqhkiG9w0BAQUFAAOCAgEAZ1RNgzHYRQmTUMUL
|
21
|
+
DI9l9DCrL01ygTVnfeeuf3CWE4C0alkMgU/V/lC6tgDre4Ya6HA7vPZtgirnXiwM
|
22
|
+
wr6HhzmHJHhKUXyY3Nh2yW7lKl/P6Ctt8xyqwEDBodmm0FbOSYatU0PkTgtbKeau
|
23
|
+
YgUSw63i3+3SbSkFOsulA6ZAB+3J4oo3l9JFW/hfA9CLFTJnDDwnoaUcxuwmb4n6
|
24
|
+
AeKA3Y07jXvVMXMDHfTWIt3hHnkkl2v5U0/FV+hT1RHjmafURNVKln4NYhvEsdpR
|
25
|
+
cSKBcJjW+jrCotEDQfquHf5qxxWT9b0+ezExNcY/uzrLQ2m86G8k4zCa8gGrkkDC
|
26
|
+
0QrVflrJdCfqHX+nH49SFCOrsbHa9YHE308Bw590rmLOtFoKeHBGmNX8rrfWpjuS
|
27
|
+
QRhyoyIAdmFR5py2pEZWpqmQnRNi+6jqYt+X04HKdNgwfzq3J0RuGBZwDvdi+fKT
|
28
|
+
UdBgSzKlHRSnwHB21VU8h09M38Mx4LfH9Tnm2nSYH4olf3hAeV8u6R2Wm2CQ7SuO
|
29
|
+
C5QSlmvkZgKvBhBVoXKAinNPHzoggayZFXYNfeneBSexPabaC3KX38StLNYOpGtr
|
30
|
+
S4nILagJ/gtL67ynCgTIj1xORHEq0H6Lx+p3An8aRHRkCzjFihBqzvtsQ8vlIB+1
|
31
|
+
fcoiS9/Mf0US6o3RBgfa+KPVAsE=
|
32
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'vagrant/util/downloader'
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'log4r'
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module Certificates
|
7
|
+
module Action
|
8
|
+
class InstallCertificates
|
9
|
+
attr_accessor :logger
|
10
|
+
|
11
|
+
def initialize(app, env)
|
12
|
+
@app = app
|
13
|
+
@machine = env[:machine]
|
14
|
+
@logger = Log4r::Logger.new('vagrant::certificates')
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
@app.call(env)
|
19
|
+
return unless @machine.config.certificates.enabled?
|
20
|
+
|
21
|
+
create_certificates_directory
|
22
|
+
@machine.ui.info(I18n.t('vagrant_certificates.certificate.upload.message'))
|
23
|
+
@machine.config.certificates.certs.each do |file|
|
24
|
+
to = File.join(certs_path, File.basename(file))
|
25
|
+
upload_certificate(file, to)
|
26
|
+
end
|
27
|
+
@machine.guest.capability(:update_certificate_bundle)
|
28
|
+
modify_etc_environment
|
29
|
+
end
|
30
|
+
|
31
|
+
def certs_path
|
32
|
+
@machine.guest.capability(:certificate_upload_path)
|
33
|
+
end
|
34
|
+
|
35
|
+
def modify_etc_environment
|
36
|
+
bundle_path = @machine.guest.capability(:certificate_file_bundle)
|
37
|
+
@logger.debug("Private certificate path: <#{bundle_path}>")
|
38
|
+
@machine.communicate.tap do |sh|
|
39
|
+
case @machine.guest.name
|
40
|
+
when :windows
|
41
|
+
sh.sudo("[Environment]::SetEnvironmentVariable('SSL_CERT_FILE','#{bundle_path}','Machine')")
|
42
|
+
else
|
43
|
+
if sh.test("grep -q 'SSL_CERT_FILE' /etc/environment", shell: '/bin/bash')
|
44
|
+
sh.sudo(%{sed "s#^SSL_CERT_FILE=.*#SSL_CERT_FILE=#{bundle_path}#" -i /etc/environment})
|
45
|
+
else
|
46
|
+
sh.sudo(%{echo "SSL_CERT_FILE=#{bundle_path}" >> /etc/environment})
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def create_certificates_directory
|
53
|
+
@logger.debug('Checking if private certificate directory is created...')
|
54
|
+
@machine.communicate.tap do |sh|
|
55
|
+
case @machine.guest.name
|
56
|
+
when :windows
|
57
|
+
return if sh.test("$ProgressPreference=\"SilentlyContinue\";if(-not(Test-Path -Path #{certs_path})){Exit 1}")
|
58
|
+
@logger.info("Creating Windows #{certs_path} for private certificates.")
|
59
|
+
sh.sudo("New-Item -Path #{certs_path} -ItemType Directory")
|
60
|
+
else
|
61
|
+
return if sh.test("test -d #{certs_path}")
|
62
|
+
@logger.info("Creating #{certs_path} for private certificates.")
|
63
|
+
sh.sudo("mkdir -p #{certs_path} && chmod 0744 #{certs_path}")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def upload_certificate(from, to)
|
69
|
+
@logger.debug("Uploading certificates #{from} -> #{to}")
|
70
|
+
if from =~ /^http[s]?/
|
71
|
+
remote = Tempfile.new('vagrant-certificates')
|
72
|
+
Vagrant::Util::Downloader.new(from, remote.path).download!
|
73
|
+
from = remote.path
|
74
|
+
end
|
75
|
+
|
76
|
+
@machine.communicate.tap do |sh|
|
77
|
+
unless certificate_matches?(from, to)
|
78
|
+
tmp_to = Pathname.new(Tempfile.new('vagrant').path).basename
|
79
|
+
@machine.ui.info(I18n.t('vagrant_certificates.certificate.upload.file', from: from, to: to))
|
80
|
+
sh.upload(from.to_s, tmp_to.to_s) # remote.path will build a "C:\" URI on windows, cp to ~ and move.
|
81
|
+
case @machine.guest.name
|
82
|
+
when :windows
|
83
|
+
sh.sudo("Move-Item -path #{tmp_to}/* -Destination #{to} -Force")
|
84
|
+
else
|
85
|
+
sh.sudo("mv #{tmp_to} #{to} && chown root: #{to} && chmod 0644 #{to}")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def certificate_matches?(from, to)
|
92
|
+
md5sum = Digest::MD5.file(from)
|
93
|
+
@logger.debug("Verifying #{from} md5sum in guest...")
|
94
|
+
@machine.communicate.tap do |sh|
|
95
|
+
case @machine.guest.name
|
96
|
+
when :windows
|
97
|
+
if sh.test("if(-not((Get-Filehash -path '#{to}' -Algorithm MD5) | Select-Object -ExpandProperty Hash) -eq '#{md5sum}'){Exit 1}")
|
98
|
+
@logger.debug('Certificate md5sum in guest matches!')
|
99
|
+
return true
|
100
|
+
end
|
101
|
+
else
|
102
|
+
return false unless sh.test("test -f #{from}")
|
103
|
+
if sh.test(%{test '#{md5sum}' = '$(md5sum "#{to}")'}, shell: '/bin/bash')
|
104
|
+
@logger.debug('Certificate md5sum in guest matches!')
|
105
|
+
return true
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
false
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Certificates
|
3
|
+
module Cap
|
4
|
+
module CoreOS
|
5
|
+
# Capability for configuring the certificate bundle on CoreOS.
|
6
|
+
module UpdateCertificateBundle
|
7
|
+
def self.update_certificate_bundle(m)
|
8
|
+
m.communicate.sudo("ls /etc/ssl/certs | awk '{print \"private/\"$1;}' >> /etc/ca-certificates.conf") # enable our custom certs
|
9
|
+
m.communicate.sudo('update-ca-certificates') do |type, data|
|
10
|
+
if [:stderr, :stdout].include?(type)
|
11
|
+
next if data =~ /stdin: is not a tty/
|
12
|
+
m.env.ui.info data
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Certificates
|
3
|
+
module Cap
|
4
|
+
module Debian
|
5
|
+
# Capability for configuring the certificate bundle on Debian.
|
6
|
+
module UpdateCertificateBundle
|
7
|
+
def self.update_certificate_bundle(m)
|
8
|
+
m.communicate.sudo("ls /usr/share/ca-certificates/private | awk '{print \"private/\"$1;}' >> /etc/ca-certificates.conf") # enable our custom certs
|
9
|
+
m.communicate.sudo('update-ca-certificates') do |type, data|
|
10
|
+
if [:stderr, :stdout].include?(type)
|
11
|
+
next if data =~ /stdin: is not a tty/
|
12
|
+
m.env.ui.info data
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'helpers'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Certificates
|
5
|
+
module Cap
|
6
|
+
module Redhat
|
7
|
+
module CertificateUploadPath
|
8
|
+
def self.certificate_upload_path(m)
|
9
|
+
m.communicate.tap do |sh|
|
10
|
+
return '/etc/pki/tls/private' if Redhat.legacy_certificate_bundle?(sh)
|
11
|
+
end
|
12
|
+
'/etc/pki/ca-trust/source/anchors'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Certificates
|
3
|
+
module Cap
|
4
|
+
module Redhat
|
5
|
+
# HACK: All versions of EL5 and below EL6.5 do not have
|
6
|
+
# support for the `update-ca-trust` command and thus the
|
7
|
+
# bundles must be managed manually.
|
8
|
+
def self.legacy_certificate_bundle?(sh)
|
9
|
+
command = %q(R=$(sed -E "s/.* ([0-9])\.([0-9]+) .*/\\1.\\2/" /etc/redhat-release))
|
10
|
+
sh.test(%Q(#{command} && [[ $R =~ ^5 || $R =~ ^6\.[0-4]+ ]]), shell: '/bin/bash') || !sh.test("rpm -q ca-certificates", shell:'/bin/bash')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'helpers'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Certificates
|
5
|
+
module Cap
|
6
|
+
module Redhat
|
7
|
+
# Capability for configuring the certificate bundle on Redhat.
|
8
|
+
module UpdateCertificateBundle
|
9
|
+
def self.update_certificate_bundle(m)
|
10
|
+
m.communicate.tap do |sh|
|
11
|
+
if Redhat.legacy_certificate_bundle?(sh)
|
12
|
+
sh.sudo(<<-SCRIPT)
|
13
|
+
BUNDLE=/etc/pki/tls/certs/ca-bundle.crt;
|
14
|
+
PRIVATE=/etc/pki/tls/ca.private.crt;
|
15
|
+
if ! [ "$(readlink $BUNDLE)" == "$PRIVATE" ]; then
|
16
|
+
find /etc/pki/tls/private -type f -exec cat {} \\; | cat $BUNDLE - > $PRIVATE ;
|
17
|
+
fi
|
18
|
+
SCRIPT
|
19
|
+
sh.sudo('/bin/ln -fsn /etc/pki/tls/ca.private.crt /etc/pki/tls/cert.pem')
|
20
|
+
sh.sudo('/bin/ln -fsn /etc/pki/tls/ca.private.crt /etc/pki/tls/certs/ca-bundle.crt')
|
21
|
+
sh.execute(<<-SCRIPT, shell: '/bin/bash', sudo: true)
|
22
|
+
if [ ! -z "$JAVA_HOME" ]; then \
|
23
|
+
find /etc/pki/tls/private -type f -exec $JAVA_HOME/bin/keytool -importcert \
|
24
|
+
-trustcacerts -noprompt -storepass changeit \
|
25
|
+
-keystore $JAVA_HOME/jre/lib/security/cacerts -file {} \\; \
|
26
|
+
else true; fi
|
27
|
+
SCRIPT
|
28
|
+
else
|
29
|
+
sh.sudo('update-ca-trust enable')
|
30
|
+
sh.sudo('update-ca-trust extract')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Certificates
|
3
|
+
module Cap
|
4
|
+
module Windows
|
5
|
+
# Capability for configuring the certificate bundle on CoreOS.
|
6
|
+
module UpdateCertificateBundle
|
7
|
+
def self.update_certificate_bundle(m)
|
8
|
+
# Import the certificates into the local machine root store
|
9
|
+
m.communicate.sudo("Get-ChildItem -Path C:/ssl/certs | Foreach-Object {certutil -addstore -enterprise -f 'Root' $_.FullName}")
|
10
|
+
# Also import the certificates into a bundle to be referenced by SSL_CERT_FILE
|
11
|
+
m.communicate.sudo("Remove-Item -Path C:/ssl/cacert.pem; Get-ChildItem -Path C:/ssl/certs | Get-Content | Out-File -FilePath C:/ssl/cacert.pem -Encoding utf8 -Append")
|
12
|
+
# Convert the cacerts.pem with Windows line endings ('\r\n') to Unix line endings ('\n')
|
13
|
+
m.communicate.sudo("$cacertContents = [io.file]::ReadAllText('C:/ssl/cacert.pem') -replace \"`r`n\",\"`n\"; [io.file]::WriteAllText('C:/ssl/cacert_unix.pem', $cacertContents)")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Certificates
|
5
|
+
class Config < Vagrant.plugin('2', :config)
|
6
|
+
attr_accessor :certs, :enabled
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@certs = UNSET_VALUE
|
10
|
+
@enabled = UNSET_VALUE
|
11
|
+
end
|
12
|
+
|
13
|
+
def enabled?
|
14
|
+
@enabled == true
|
15
|
+
end
|
16
|
+
|
17
|
+
def disabled?
|
18
|
+
!enabled?
|
19
|
+
end
|
20
|
+
|
21
|
+
def disable!
|
22
|
+
@enabled = false
|
23
|
+
end
|
24
|
+
|
25
|
+
def validate(machine)
|
26
|
+
errors = []
|
27
|
+
if enabled?
|
28
|
+
# If the certificates specified do not exist on the host
|
29
|
+
# disk we should error out very loudly. Because this will
|
30
|
+
# likely affect guest operation.
|
31
|
+
@certs.reject { |f| f =~ /^http[s]?/ || File.exist?(f) }.each do |f|
|
32
|
+
errors << I18n.t('vagrant_certificates.certificate.not_found', filepath: f)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
{ 'vagrant-certificates' => errors }
|
37
|
+
end
|
38
|
+
|
39
|
+
def finalize!
|
40
|
+
@enabled = false if @enabled == UNSET_VALUE
|
41
|
+
@certs = [] if @certs == UNSET_VALUE
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
I18n.load_path << File.expand_path('../../../locales/en.yml', __FILE__)
|
2
|
+
|
3
|
+
unless Gem::Requirement.new('>= 1.5').satisfied_by?(Gem::Version.new(Vagrant::VERSION))
|
4
|
+
fail I18n.t('vagrant_certificates.unsupported.vagrant_version', requirement: '>= 1.5')
|
5
|
+
end
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module Certificates
|
9
|
+
class Plugin < Vagrant.plugin('2')
|
10
|
+
name 'vagrant-certificates'
|
11
|
+
description <<-DESC
|
12
|
+
Installs root certificates into guest operating system's trusted bundle.
|
13
|
+
DESC
|
14
|
+
|
15
|
+
config(:certificates) do
|
16
|
+
require_relative 'config'
|
17
|
+
Config
|
18
|
+
end
|
19
|
+
|
20
|
+
action_hook(Plugin::ALL_ACTIONS) do |hook|
|
21
|
+
require_relative 'action/install_certificates'
|
22
|
+
hook.after(Vagrant::Action::Builtin::Provision, Action::InstallCertificates)
|
23
|
+
end
|
24
|
+
|
25
|
+
# All supported guest systems must have these capabilities
|
26
|
+
# implemented. If any of them aren't config validate will fail.
|
27
|
+
guest_capability('debian', 'update_certificate_bundle') do
|
28
|
+
require_relative 'cap/debian/update_certificate_bundle'
|
29
|
+
Cap::Debian::UpdateCertificateBundle
|
30
|
+
end
|
31
|
+
|
32
|
+
guest_capability('redhat', 'update_certificate_bundle') do
|
33
|
+
require_relative 'cap/redhat/update_certificate_bundle'
|
34
|
+
Cap::Redhat::UpdateCertificateBundle
|
35
|
+
end
|
36
|
+
|
37
|
+
guest_capability('coreos', 'update_certificate_bundle') do
|
38
|
+
require_relative 'cap/coreos/update_certificate_bundle'
|
39
|
+
Cap::CoreOS::UpdateCertificateBundle
|
40
|
+
end
|
41
|
+
|
42
|
+
guest_capability('windows', 'update_certificate_bundle') do
|
43
|
+
require_relative 'cap/windows/update_certificate_bundle'
|
44
|
+
Cap::Windows::UpdateCertificateBundle
|
45
|
+
end
|
46
|
+
|
47
|
+
guest_capability('debian', 'certificate_upload_path') do
|
48
|
+
require_relative 'cap/debian/certificate_upload_path'
|
49
|
+
Cap::Debian::CertificateUploadPath
|
50
|
+
end
|
51
|
+
|
52
|
+
guest_capability('redhat', 'certificate_upload_path') do
|
53
|
+
require_relative 'cap/redhat/certificate_upload_path'
|
54
|
+
Cap::Redhat::CertificateUploadPath
|
55
|
+
end
|
56
|
+
|
57
|
+
guest_capability('coreos', 'certificate_upload_path') do
|
58
|
+
require_relative 'cap/coreos/certificate_upload_path'
|
59
|
+
Cap::CoreOS::CertificateUploadPath
|
60
|
+
end
|
61
|
+
|
62
|
+
guest_capability('windows', 'certificate_upload_path') do
|
63
|
+
require_relative 'cap/windows/certificate_upload_path'
|
64
|
+
Cap::Windows::CertificateUploadPath
|
65
|
+
end
|
66
|
+
|
67
|
+
guest_capability('debian', 'certificate_file_bundle') do
|
68
|
+
require_relative 'cap/debian/certificate_file_bundle'
|
69
|
+
Cap::Debian::CertificateFileBundle
|
70
|
+
end
|
71
|
+
|
72
|
+
guest_capability('redhat', 'certificate_file_bundle') do
|
73
|
+
require_relative 'cap/redhat/certificate_file_bundle'
|
74
|
+
Cap::Redhat::CertificateFileBundle
|
75
|
+
end
|
76
|
+
|
77
|
+
guest_capability('coreos', 'certificate_file_bundle') do
|
78
|
+
require_relative 'cap/coreos/certificate_file_bundle'
|
79
|
+
Cap::CoreOS::CertificateFileBundle
|
80
|
+
end
|
81
|
+
|
82
|
+
guest_capability('windows', 'certificate_file_bundle') do
|
83
|
+
require_relative 'cap/windows/certificate_file_bundle'
|
84
|
+
Cap::Windows::CertificateFileBundle
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
en:
|
2
|
+
vagrant_certificates:
|
3
|
+
unsupported:
|
4
|
+
guest_system: |
|
5
|
+
Plugin does not support guest operating system.
|
6
|
+
vagrant_version: |
|
7
|
+
Plugin does not support Vagrant version less than '%{requirement}'.
|
8
|
+
not_enabled: |
|
9
|
+
Plugin is not enabled.
|
10
|
+
certificate:
|
11
|
+
not_found: |
|
12
|
+
Certificate '%{filepath}' not found on host system.
|
13
|
+
upload:
|
14
|
+
message: |
|
15
|
+
Uploading root certificates to guest instance...
|
16
|
+
file: |
|
17
|
+
-- %{from} => %{to}
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'vagrant-certificates/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'vagrant-certificates'
|
8
|
+
spec.version = VagrantPlugins::Certificates::VERSION
|
9
|
+
spec.authors = ['William Bailey', 'John Bellone']
|
10
|
+
spec.email = ['mail@williambailey.org.uk', 'jbellone@bloomberg.net']
|
11
|
+
spec.summary = 'A Vagrant plugin that installs CA certificates onto the virtual machine.'
|
12
|
+
spec.description = <<-EOF
|
13
|
+
A Vagrant plugin that installs CA certificates onto the virtual machine.
|
14
|
+
This is useful, for example, in the case where you are behind a corporate proxy
|
15
|
+
server that injects its own self signed SSL certificates when you visit https sites.
|
16
|
+
EOF
|
17
|
+
spec.homepage = 'https://github.com/williambailey/vagrant-certificates'
|
18
|
+
spec.license = 'MIT'
|
19
|
+
|
20
|
+
spec.files = `git ls-files`.split($/)
|
21
|
+
spec.test_files = spec.files.grep(/^(test|spec|features)\//)
|
22
|
+
spec.require_paths = %w(lib)
|
23
|
+
|
24
|
+
spec.cert_chain = ['certs/jbellone.pem']
|
25
|
+
spec.signing_key = File.expand_path(File.join(Dir.home, '.ssh', 'gem-private_key.pem')) if $0 =~ /gem\z/
|
26
|
+
|
27
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vagrant-certificates
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- William Bailey
|
8
|
+
- John Bellone
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain:
|
12
|
+
- certs/jbellone.pem
|
13
|
+
date: 2019-04-23 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: bundler
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.7'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "~>"
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '1.7'
|
29
|
+
description: |2
|
30
|
+
A Vagrant plugin that installs CA certificates onto the virtual machine.
|
31
|
+
This is useful, for example, in the case where you are behind a corporate proxy
|
32
|
+
server that injects its own self signed SSL certificates when you visit https sites.
|
33
|
+
email:
|
34
|
+
- mail@williambailey.org.uk
|
35
|
+
- jbellone@bloomberg.net
|
36
|
+
executables: []
|
37
|
+
extensions: []
|
38
|
+
extra_rdoc_files: []
|
39
|
+
files:
|
40
|
+
- ".github/CONTRIBUTING.md"
|
41
|
+
- ".gitignore"
|
42
|
+
- ".rspec"
|
43
|
+
- CHANGELOG.md
|
44
|
+
- Gemfile
|
45
|
+
- LICENSE
|
46
|
+
- README.md
|
47
|
+
- Rakefile
|
48
|
+
- bin/rspec
|
49
|
+
- certs/jbellone.pem
|
50
|
+
- lib/vagrant-certificates.rb
|
51
|
+
- lib/vagrant-certificates/action/install_certificates.rb
|
52
|
+
- lib/vagrant-certificates/cap/coreos/certificate_file_bundle.rb
|
53
|
+
- lib/vagrant-certificates/cap/coreos/certificate_upload_path.rb
|
54
|
+
- lib/vagrant-certificates/cap/coreos/update_certificate_bundle.rb
|
55
|
+
- lib/vagrant-certificates/cap/debian/certificate_file_bundle.rb
|
56
|
+
- lib/vagrant-certificates/cap/debian/certificate_upload_path.rb
|
57
|
+
- lib/vagrant-certificates/cap/debian/update_certificate_bundle.rb
|
58
|
+
- lib/vagrant-certificates/cap/redhat/certificate_file_bundle.rb
|
59
|
+
- lib/vagrant-certificates/cap/redhat/certificate_upload_path.rb
|
60
|
+
- lib/vagrant-certificates/cap/redhat/helpers.rb
|
61
|
+
- lib/vagrant-certificates/cap/redhat/update_certificate_bundle.rb
|
62
|
+
- lib/vagrant-certificates/cap/windows/certificate_file_bundle.rb
|
63
|
+
- lib/vagrant-certificates/cap/windows/certificate_upload_path.rb
|
64
|
+
- lib/vagrant-certificates/cap/windows/update_certificate_bundle.rb
|
65
|
+
- lib/vagrant-certificates/config.rb
|
66
|
+
- lib/vagrant-certificates/plugin.rb
|
67
|
+
- lib/vagrant-certificates/version.rb
|
68
|
+
- locales/en.yml
|
69
|
+
- spec/spec_helper.rb
|
70
|
+
- spec/unit/vagrant-certificates/action/install_certificates_spec.rb
|
71
|
+
- spec/unit/vagrant-certificates/cap/coreos/certificate_upload_path_spec.rb
|
72
|
+
- spec/unit/vagrant-certificates/cap/coreos/update_certificate_bundle_spec.rb
|
73
|
+
- spec/unit/vagrant-certificates/cap/debian/certificate_upload_path_spec.rb
|
74
|
+
- spec/unit/vagrant-certificates/cap/debian/update_certificate_bundle_spec.rb
|
75
|
+
- spec/unit/vagrant-certificates/cap/redhat/certificate_upload_path_spec.rb
|
76
|
+
- spec/unit/vagrant-certificates/cap/redhat/update_certificate_bundle_spec.rb
|
77
|
+
- spec/unit/vagrant-certificates/cap/windows/certificate_upload_path_spec.rb
|
78
|
+
- spec/unit/vagrant-certificates/cap/windows/update_certificate_bundle_spec.rb
|
79
|
+
- spec/unit/vagrant-certificates/config_spec.rb
|
80
|
+
- vagrant-certificates.gemspec
|
81
|
+
homepage: https://github.com/williambailey/vagrant-certificates
|
82
|
+
licenses:
|
83
|
+
- MIT
|
84
|
+
metadata: {}
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
requirements: []
|
100
|
+
rubyforge_project:
|
101
|
+
rubygems_version: 2.7.6
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: A Vagrant plugin that installs CA certificates onto the virtual machine.
|
105
|
+
test_files:
|
106
|
+
- spec/spec_helper.rb
|
107
|
+
- spec/unit/vagrant-certificates/action/install_certificates_spec.rb
|
108
|
+
- spec/unit/vagrant-certificates/cap/coreos/certificate_upload_path_spec.rb
|
109
|
+
- spec/unit/vagrant-certificates/cap/coreos/update_certificate_bundle_spec.rb
|
110
|
+
- spec/unit/vagrant-certificates/cap/debian/certificate_upload_path_spec.rb
|
111
|
+
- spec/unit/vagrant-certificates/cap/debian/update_certificate_bundle_spec.rb
|
112
|
+
- spec/unit/vagrant-certificates/cap/redhat/certificate_upload_path_spec.rb
|
113
|
+
- spec/unit/vagrant-certificates/cap/redhat/update_certificate_bundle_spec.rb
|
114
|
+
- spec/unit/vagrant-certificates/cap/windows/certificate_upload_path_spec.rb
|
115
|
+
- spec/unit/vagrant-certificates/cap/windows/update_certificate_bundle_spec.rb
|
116
|
+
- spec/unit/vagrant-certificates/config_spec.rb
|