vagrant-certificates 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.github/CONTRIBUTING.md +8 -0
  3. data/.gitignore +18 -0
  4. data/.rspec +2 -0
  5. data/CHANGELOG.md +8 -0
  6. data/Gemfile +7 -0
  7. data/LICENSE +22 -0
  8. data/README.md +132 -0
  9. data/Rakefile +1 -0
  10. data/bin/rspec +17 -0
  11. data/certs/jbellone.pem +32 -0
  12. data/lib/vagrant-certificates/action/install_certificates.rb +114 -0
  13. data/lib/vagrant-certificates/cap/coreos/certificate_file_bundle.rb +13 -0
  14. data/lib/vagrant-certificates/cap/coreos/certificate_upload_path.rb +13 -0
  15. data/lib/vagrant-certificates/cap/coreos/update_certificate_bundle.rb +20 -0
  16. data/lib/vagrant-certificates/cap/debian/certificate_file_bundle.rb +13 -0
  17. data/lib/vagrant-certificates/cap/debian/certificate_upload_path.rb +13 -0
  18. data/lib/vagrant-certificates/cap/debian/update_certificate_bundle.rb +20 -0
  19. data/lib/vagrant-certificates/cap/redhat/certificate_file_bundle.rb +13 -0
  20. data/lib/vagrant-certificates/cap/redhat/certificate_upload_path.rb +18 -0
  21. data/lib/vagrant-certificates/cap/redhat/helpers.rb +15 -0
  22. data/lib/vagrant-certificates/cap/redhat/update_certificate_bundle.rb +38 -0
  23. data/lib/vagrant-certificates/cap/windows/certificate_file_bundle.rb +13 -0
  24. data/lib/vagrant-certificates/cap/windows/certificate_upload_path.rb +13 -0
  25. data/lib/vagrant-certificates/cap/windows/update_certificate_bundle.rb +19 -0
  26. data/lib/vagrant-certificates/config.rb +45 -0
  27. data/lib/vagrant-certificates/plugin.rb +88 -0
  28. data/lib/vagrant-certificates/version.rb +5 -0
  29. data/lib/vagrant-certificates.rb +2 -0
  30. data/locales/en.yml +17 -0
  31. data/spec/spec_helper.rb +10 -0
  32. data/spec/unit/vagrant-certificates/action/install_certificates_spec.rb +5 -0
  33. data/spec/unit/vagrant-certificates/cap/coreos/certificate_upload_path_spec.rb +5 -0
  34. data/spec/unit/vagrant-certificates/cap/coreos/update_certificate_bundle_spec.rb +5 -0
  35. data/spec/unit/vagrant-certificates/cap/debian/certificate_upload_path_spec.rb +5 -0
  36. data/spec/unit/vagrant-certificates/cap/debian/update_certificate_bundle_spec.rb +5 -0
  37. data/spec/unit/vagrant-certificates/cap/redhat/certificate_upload_path_spec.rb +5 -0
  38. data/spec/unit/vagrant-certificates/cap/redhat/update_certificate_bundle_spec.rb +5 -0
  39. data/spec/unit/vagrant-certificates/cap/windows/certificate_upload_path_spec.rb +5 -0
  40. data/spec/unit/vagrant-certificates/cap/windows/update_certificate_bundle_spec.rb +5 -0
  41. data/spec/unit/vagrant-certificates/config_spec.rb +5 -0
  42. data/vagrant-certificates.gemspec +28 -0
  43. 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
@@ -0,0 +1,8 @@
1
+ ## Contributing
2
+
3
+ 1. Fork the repository on Github
4
+ 2. Create a named feature branch (i.e. `add-new-recipe`)
5
+ 3. Write your change
6
+ 4. Write tests for your change (if applicable)
7
+ 5. Run the tests, ensuring they all pass
8
+ 6. Submit a Pull Request
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
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
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ group :development, :test do
5
+ gem 'rake'
6
+ gem 'rspec'
7
+ end
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")
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
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,13 @@
1
+ module VagrantPlugins
2
+ module Certificates
3
+ module Cap
4
+ module CoreOS
5
+ module CertificateFileBundle
6
+ def self.certificate_file_bundle(m)
7
+ '/etc/ssl/certs/ca-certificates.crt'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module VagrantPlugins
2
+ module Certificates
3
+ module Cap
4
+ module CoreOS
5
+ module CertificateUploadPath
6
+ def self.certificate_upload_path(m)
7
+ '/etc/ssl/certs'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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,13 @@
1
+ module VagrantPlugins
2
+ module Certificates
3
+ module Cap
4
+ module Debian
5
+ module CertificateFileBundle
6
+ def self.certificate_file_bundle(m)
7
+ '/etc/ssl/certs/ca-certificates.crt'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module VagrantPlugins
2
+ module Certificates
3
+ module Cap
4
+ module Debian
5
+ module CertificateUploadPath
6
+ def self.certificate_upload_path(m)
7
+ '/usr/share/ca-certificates/private'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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,13 @@
1
+ module VagrantPlugins
2
+ module Certificates
3
+ module Cap
4
+ module Redhat
5
+ module CertificateFileBundle
6
+ def self.certificate_file_bundle(m)
7
+ '/etc/pki/tls/cert.pem'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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,13 @@
1
+ module VagrantPlugins
2
+ module Certificates
3
+ module Cap
4
+ module Windows
5
+ module CertificateFileBundle
6
+ def self.certificate_file_bundle(m)
7
+ 'C:/ssl/cacert.pem'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module VagrantPlugins
2
+ module Certificates
3
+ module Cap
4
+ module Windows
5
+ module CertificateUploadPath
6
+ def self.certificate_upload_path(m)
7
+ 'C:/ssl/certs'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ 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
@@ -0,0 +1,5 @@
1
+ module VagrantPlugins
2
+ module Certificates
3
+ VERSION = '2.0.0'
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'vagrant-certificates/version'
2
+ require_relative 'vagrant-certificates/plugin'
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}
@@ -0,0 +1,10 @@
1
+ require 'rspec/its'
2
+ require 'vagrant-certificates'
3
+
4
+ RSpec.configure do |config|
5
+ config.expect_with :rspec do |c|
6
+ c.syntax = :expect
7
+ end
8
+ config.color = true
9
+ config.tty = true
10
+ end
@@ -0,0 +1,5 @@
1
+ require 'vagrant-certificates/action/install_certificates'
2
+ require 'spec_helper'
3
+
4
+ describe VagrantPlugins::Certificates::Action::InstallCertificates do
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'vagrant-certificates/cap/coreos/certificate_upload_path'
2
+ require 'spec_helper'
3
+
4
+ describe VagrantPlugins::Certificates::Cap::CoreOS::CertificateUploadPath do
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'vagrant-certificates/cap/coreos/update_certificate_bundle'
2
+ require 'spec_helper'
3
+
4
+ describe VagrantPlugins::Certificates::Cap::CoreOS::UpdateCertificateBundle do
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'vagrant-certificates/cap/debian/certificate_upload_path'
2
+ require 'spec_helper'
3
+
4
+ describe VagrantPlugins::Certificates::Cap::Debian::CertificateUploadPath do
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'vagrant-certificates/cap/debian/update_certificate_bundle'
2
+ require 'spec_helper'
3
+
4
+ describe VagrantPlugins::Certificates::Cap::Debian::UpdateCertificateBundle do
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'vagrant-certificates/cap/redhat/certificate_upload_path'
2
+ require 'spec_helper'
3
+
4
+ describe VagrantPlugins::Certificates::Cap::Redhat::CertificateUploadPath do
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'vagrant-certificates/cap/redhat/update_certificate_bundle'
2
+ require 'spec_helper'
3
+
4
+ describe VagrantPlugins::Certificates::Cap::Redhat::UpdateCertificateBundle do
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'vagrant-certificates/cap/windows/certificate_upload_path'
2
+ require 'spec_helper'
3
+
4
+ describe VagrantPlugins::Certificates::Cap::Windows::CertificateUploadPath do
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'vagrant-certificates/cap/windows/update_certificate_bundle'
2
+ require 'spec_helper'
3
+
4
+ describe VagrantPlugins::Certificates::Cap::Windows::UpdateCertificateBundle do
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'vagrant-certificates/config'
2
+ require 'spec_helper'
3
+
4
+ describe VagrantPlugins::Certificates::Config do
5
+ end
@@ -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