vagrant-certificates 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
![Gem Version](https://img.shields.io/gem/v/vagrant-certificates.svg)
|
3
|
+
![License](https://img.shields.io/github/license/gfi-centre-ouest/vagrant-certificates.svg)
|
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
|