mirror of
https://github.com/inspec/inspec
synced 2024-11-15 01:17:08 +00:00
CFINSPEC-84: Add be_valid matcher for x509_private_key
Signed-off-by: Sonu Saha <sonu.saha@progress.com>
This commit is contained in:
parent
6de4a02a60
commit
21bed51bc7
1 changed files with 86 additions and 0 deletions
86
lib/inspec/resources/x509_private_key.rb
Normal file
86
lib/inspec/resources/x509_private_key.rb
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
require "openssl" unless defined?(OpenSSL)
|
||||||
|
require "inspec/utils/file_reader"
|
||||||
|
|
||||||
|
module Inspec::Resources
|
||||||
|
class X509PrivateKey < Inspec.resource(1)
|
||||||
|
# Resource internal name.
|
||||||
|
name "x509_private_key"
|
||||||
|
|
||||||
|
# Restrict to only run on the below platforms (if none were given,
|
||||||
|
# all OS's and cloud API's supported)
|
||||||
|
supports platform: "unix"
|
||||||
|
supports platform: "windows"
|
||||||
|
|
||||||
|
desc "Use the ipnat InSpec audit resource to test the x509 private key"
|
||||||
|
|
||||||
|
example <<~EXAMPLE
|
||||||
|
describe "x509_private_key" do
|
||||||
|
its("shoe_size") { should cmp 10 }
|
||||||
|
end
|
||||||
|
describe "x509_private_key" do
|
||||||
|
it { should be_purple }
|
||||||
|
end
|
||||||
|
EXAMPLE
|
||||||
|
|
||||||
|
# Resource initialization.
|
||||||
|
attr_reader :secret_key_path, :passphrase, :openssl_utility
|
||||||
|
def initialize(secret_key_path, passphrase = nil)
|
||||||
|
@openssl_utility = check_openssl_or_error
|
||||||
|
@secret_key_path = secret_key_path
|
||||||
|
@passphrase = passphrase
|
||||||
|
end
|
||||||
|
|
||||||
|
# Define a resource ID. This is used in reporting engines to uniquely identify the individual resource.
|
||||||
|
# This might be a file path, or a process ID, or a cloud instance ID. Only meaningful to the implementation.
|
||||||
|
# Must be a string. Defaults to the empty string if not implemented.
|
||||||
|
def resource_id
|
||||||
|
# replace value specific unique to this individual resource instance
|
||||||
|
"something special"
|
||||||
|
end
|
||||||
|
|
||||||
|
# Define how you want your resource to appear in test reports. Commonly, this is just the resource name and the resource ID.
|
||||||
|
def to_s
|
||||||
|
"x509_private_key #{resource_id}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def has_bells?
|
||||||
|
# positive or negative expectations specific to this resource instance
|
||||||
|
true # Jingle all the way
|
||||||
|
end
|
||||||
|
|
||||||
|
def valid?
|
||||||
|
# - With passphrase
|
||||||
|
# `openssl rsa -in alice_private.pem -check -noout -passin pass:alice123`
|
||||||
|
# - Without passphrase - 1
|
||||||
|
# `openssl rsa -in chloe_private.pem -check -noout -passin pass:stdin`
|
||||||
|
# - Without passphrase - 2
|
||||||
|
# `openssl rsa -in chloe_private.pem -check -noout`
|
||||||
|
openssl_valid_cmd = "#{openssl_utility} rsa -in #{secret_key_path} -check -noout"
|
||||||
|
openssl_valid_cmd.concat(" -passin pass:#{passphrase}") if passphrase
|
||||||
|
exec_openssl_valid_cmd = inspec.command(openssl_valid_cmd)
|
||||||
|
# require "byebug"; byebug
|
||||||
|
exec_openssl_valid_cmd.exit_status.to_i == 0
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
def encrypted?
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# This resource requires openssl to be available on the system
|
||||||
|
def check_openssl_or_error
|
||||||
|
%w{/usr/sbin/openssl /usr/bin/openssl /sbin/openssl /bin/openssl openssl}.each do |cmd|
|
||||||
|
return cmd if inspec.command(cmd).exist?
|
||||||
|
end
|
||||||
|
|
||||||
|
raise Inspec::Exceptions::ResourceFailed, "Could not find `openssl` on your system."
|
||||||
|
end
|
||||||
|
|
||||||
|
# def openssl_cmd
|
||||||
|
# "#{openssl_utility} rsa -in #{secret_key_path} -check -noout"
|
||||||
|
# end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue