varanus 0.3.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/CHANGELOG.md +18 -0
- data/Gemfile.lock +45 -43
- data/lib/varanus.rb +38 -2
- data/lib/varanus/dcv.rb +62 -0
- data/lib/varanus/domain.rb +42 -0
- data/lib/varanus/organization.rb +13 -0
- data/lib/varanus/reports.rb +7 -8
- data/lib/varanus/rest_resource.rb +56 -0
- data/lib/varanus/ssl.rb +73 -49
- data/lib/varanus/ssl/csr.rb +2 -0
- data/lib/varanus/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0b74f92a4981ac8294eb1fe84c4361f1dc3a175be3735f7d485f7b5edd9963aa
|
|
4
|
+
data.tar.gz: 5a38ba280217b30fe842a99786acf761f081d135f1180cb3950bfbab5f50904a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 02ece0e219a9f47fe84ec8faaf406194f13082a1797793c23760643b8547140307fc243550e7d36d1d8412ca586850d0535a419a2dc50a9b7b90a4e4f660af67
|
|
7
|
+
data.tar.gz: 80435d29c565a99a191a85938ae4a505b01c68a38c608d063e9c10809d4eae1c2a8cad9872a9cc3f5b518a9e1084e7c625a40f287e66e1c17900ae659200095c
|
data/.travis.yml
CHANGED
|
@@ -6,10 +6,9 @@ sudo: false
|
|
|
6
6
|
language: ruby
|
|
7
7
|
cache: bundler
|
|
8
8
|
rvm:
|
|
9
|
-
- 2.3
|
|
10
|
-
- 2.4
|
|
11
9
|
- 2.5
|
|
12
10
|
- 2.6
|
|
11
|
+
- 2.7
|
|
13
12
|
before_install: gem install bundler -v 1.16.5
|
|
14
13
|
before_script:
|
|
15
14
|
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
### Version 0.6.0 (2020-02-01)
|
|
2
|
+
* Add Varanus::SSL#report
|
|
3
|
+
* Varanus::Reports (Varanus#reports) is now deprecated.
|
|
4
|
+
|
|
5
|
+
### Version 0.5.1 (2021-01-28)
|
|
6
|
+
* Varanus::SSL::CSR - support EC certs
|
|
7
|
+
|
|
8
|
+
### Version 0.5.0 (2021-01-26)
|
|
9
|
+
* Add Varanus::Domain
|
|
10
|
+
* Add Varanus::SSL#list and Varanus::SSL#info
|
|
11
|
+
* Add Varanus::Organization
|
|
12
|
+
|
|
13
|
+
### 0.4.0 (2021-01-06)
|
|
14
|
+
* Add Varanus::DCV
|
|
15
|
+
|
|
16
|
+
### 0.3.1 (2020-10-14)
|
|
17
|
+
* Fix issue when Sectigo reports two identical 'Short Life' certs
|
|
18
|
+
|
|
1
19
|
### 0.3.0 (2020-08-24)
|
|
2
20
|
* Add support for new 'Short Life' certs
|
|
3
21
|
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
varanus (0.
|
|
4
|
+
varanus (0.6.0)
|
|
5
5
|
faraday
|
|
6
6
|
faraday_middleware
|
|
7
7
|
savon (~> 2.0)
|
|
@@ -9,61 +9,61 @@ PATH
|
|
|
9
9
|
GEM
|
|
10
10
|
remote: https://rubygems.org/
|
|
11
11
|
specs:
|
|
12
|
-
addressable (2.
|
|
13
|
-
public_suffix (>= 2.0.2, <
|
|
12
|
+
addressable (2.7.0)
|
|
13
|
+
public_suffix (>= 2.0.2, < 5.0)
|
|
14
14
|
akami (1.3.1)
|
|
15
15
|
gyoku (>= 0.4.0)
|
|
16
16
|
nokogiri
|
|
17
17
|
ast (2.4.1)
|
|
18
|
-
builder (3.2.
|
|
19
|
-
crack (0.4.
|
|
20
|
-
|
|
21
|
-
docile (1.3.
|
|
22
|
-
faraday (
|
|
18
|
+
builder (3.2.4)
|
|
19
|
+
crack (0.4.5)
|
|
20
|
+
rexml
|
|
21
|
+
docile (1.3.4)
|
|
22
|
+
faraday (1.3.0)
|
|
23
|
+
faraday-net_http (~> 1.0)
|
|
23
24
|
multipart-post (>= 1.2, < 3)
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
ruby2_keywords
|
|
26
|
+
faraday-net_http (1.0.0)
|
|
27
|
+
faraday_middleware (1.0.0)
|
|
28
|
+
faraday (~> 1.0)
|
|
26
29
|
gyoku (1.3.1)
|
|
27
30
|
builder (>= 2.1.2)
|
|
28
|
-
hashdiff (0.
|
|
29
|
-
httpi (2.4.
|
|
31
|
+
hashdiff (1.0.1)
|
|
32
|
+
httpi (2.4.5)
|
|
30
33
|
rack
|
|
31
34
|
socksify
|
|
32
|
-
|
|
33
|
-
metaclass (0.0.4)
|
|
34
|
-
mini_portile2 (2.3.0)
|
|
35
|
-
minitest (5.11.3)
|
|
35
|
+
minitest (5.14.3)
|
|
36
36
|
minitest-rg (5.2.0)
|
|
37
37
|
minitest (~> 5.0)
|
|
38
|
-
mocha (1.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
mini_portile2 (~> 2.3.0)
|
|
38
|
+
mocha (1.12.0)
|
|
39
|
+
multipart-post (2.1.1)
|
|
40
|
+
nokogiri (1.11.1-x86_64-linux)
|
|
41
|
+
racc (~> 1.4)
|
|
43
42
|
nori (2.6.0)
|
|
44
|
-
parallel (1.
|
|
45
|
-
parser (
|
|
43
|
+
parallel (1.20.1)
|
|
44
|
+
parser (3.0.0.0)
|
|
46
45
|
ast (~> 2.4.1)
|
|
47
|
-
public_suffix (
|
|
48
|
-
|
|
46
|
+
public_suffix (4.0.6)
|
|
47
|
+
racc (1.5.2)
|
|
48
|
+
rack (2.2.3)
|
|
49
49
|
rainbow (3.0.0)
|
|
50
50
|
rake (10.5.0)
|
|
51
|
-
regexp_parser (
|
|
51
|
+
regexp_parser (2.0.3)
|
|
52
52
|
rexml (3.2.4)
|
|
53
|
-
rubocop (
|
|
53
|
+
rubocop (1.7.0)
|
|
54
54
|
parallel (~> 1.10)
|
|
55
|
-
parser (>= 2.7.1.
|
|
55
|
+
parser (>= 2.7.1.5)
|
|
56
56
|
rainbow (>= 2.2.2, < 4.0)
|
|
57
|
-
regexp_parser (>= 1.
|
|
57
|
+
regexp_parser (>= 1.8, < 3.0)
|
|
58
58
|
rexml
|
|
59
|
-
rubocop-ast (>=
|
|
59
|
+
rubocop-ast (>= 1.2.0, < 2.0)
|
|
60
60
|
ruby-progressbar (~> 1.7)
|
|
61
61
|
unicode-display_width (>= 1.4.0, < 2.0)
|
|
62
|
-
rubocop-ast (
|
|
63
|
-
parser (>= 2.7.1.
|
|
64
|
-
ruby-progressbar (1.
|
|
65
|
-
|
|
66
|
-
savon (2.12.
|
|
62
|
+
rubocop-ast (1.4.0)
|
|
63
|
+
parser (>= 2.7.1.5)
|
|
64
|
+
ruby-progressbar (1.11.0)
|
|
65
|
+
ruby2_keywords (0.0.2)
|
|
66
|
+
savon (2.12.1)
|
|
67
67
|
akami (~> 1.2)
|
|
68
68
|
builder (>= 2.1.2)
|
|
69
69
|
gyoku (~> 1.2)
|
|
@@ -71,21 +71,23 @@ GEM
|
|
|
71
71
|
nokogiri (>= 1.8.1)
|
|
72
72
|
nori (~> 2.4)
|
|
73
73
|
wasabi (~> 3.4)
|
|
74
|
-
simplecov (0.
|
|
74
|
+
simplecov (0.21.1)
|
|
75
75
|
docile (~> 1.1)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
simplecov-html (0.
|
|
76
|
+
simplecov-html (~> 0.11)
|
|
77
|
+
simplecov_json_formatter (~> 0.1)
|
|
78
|
+
simplecov-html (0.12.3)
|
|
79
|
+
simplecov_json_formatter (0.1.2)
|
|
79
80
|
socksify (1.7.1)
|
|
80
81
|
unicode-display_width (1.7.0)
|
|
81
|
-
wasabi (3.
|
|
82
|
+
wasabi (3.6.1)
|
|
83
|
+
addressable
|
|
82
84
|
httpi (~> 2.0)
|
|
83
85
|
nokogiri (>= 1.4.2)
|
|
84
|
-
webmock (3.
|
|
86
|
+
webmock (3.11.0)
|
|
85
87
|
addressable (>= 2.3.6)
|
|
86
88
|
crack (>= 0.3.2)
|
|
87
|
-
hashdiff
|
|
88
|
-
yard (0.9.
|
|
89
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
|
90
|
+
yard (0.9.26)
|
|
89
91
|
|
|
90
92
|
PLATFORMS
|
|
91
93
|
ruby
|
data/lib/varanus.rb
CHANGED
|
@@ -14,8 +14,40 @@ class Varanus
|
|
|
14
14
|
@password = password
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
#
|
|
18
|
-
|
|
17
|
+
# :nodoc:
|
|
18
|
+
def connection
|
|
19
|
+
@connection ||= Faraday.new(url: 'https://cert-manager.com/api',
|
|
20
|
+
request: { timeout: 300 }) do |conn|
|
|
21
|
+
conn.request :json
|
|
22
|
+
conn.response :json, content_type: /\bjson$/
|
|
23
|
+
|
|
24
|
+
conn.headers['login'] = @username
|
|
25
|
+
conn.headers['password'] = @password
|
|
26
|
+
conn.headers['customerUri'] = @customer_uri
|
|
27
|
+
|
|
28
|
+
conn.adapter Faraday.default_adapter
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Retrive DCV instance
|
|
33
|
+
# @return [Varanus::DCV]
|
|
34
|
+
def dcv
|
|
35
|
+
@dcv ||= DCV.new(self)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Retrieve Domain instance
|
|
39
|
+
# @return [Varanus::Domain]
|
|
40
|
+
def domain
|
|
41
|
+
@domain ||= Domain.new(self)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Retrieve Organization instance
|
|
45
|
+
# @return [Varanus::Organization]
|
|
46
|
+
def organization
|
|
47
|
+
@organization ||= Organization.new(self)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# DEPRECATED
|
|
19
51
|
def reports
|
|
20
52
|
@reports ||= Reports.new(self)
|
|
21
53
|
end
|
|
@@ -35,6 +67,10 @@ require 'savon'
|
|
|
35
67
|
|
|
36
68
|
# Require other files in this gem
|
|
37
69
|
require 'varanus/error'
|
|
70
|
+
require 'varanus/rest_resource'
|
|
71
|
+
require 'varanus/dcv'
|
|
72
|
+
require 'varanus/domain'
|
|
73
|
+
require 'varanus/organization'
|
|
38
74
|
require 'varanus/reports'
|
|
39
75
|
require 'varanus/ssl'
|
|
40
76
|
require 'varanus/ssl/csr'
|
data/lib/varanus/dcv.rb
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# An connection to the DCV API. This should not be initialized directly. Instead,
|
|
4
|
+
# use Varanus#dcv
|
|
5
|
+
class Varanus::DCV < Varanus::RestResource
|
|
6
|
+
# Returns an Array of DCV information about searched for domains.
|
|
7
|
+
# This method will automatically page through all results
|
|
8
|
+
# @param opts [Hash] - all opts are optional
|
|
9
|
+
# @option opts [String] :domain Domain to search for
|
|
10
|
+
# @option opts [Integer] :org ID of organization
|
|
11
|
+
# @option opts [Integer] :department ID of department
|
|
12
|
+
# @option opts [String] :dcvStatus
|
|
13
|
+
# @option opts [String] :orderStatus
|
|
14
|
+
# @option opts [Integer] :expiresIn Expires in (days)
|
|
15
|
+
#
|
|
16
|
+
# Results will included an extra 'expiration_date_obj' if 'expirationDate' is in the
|
|
17
|
+
# response
|
|
18
|
+
def search opts = {}
|
|
19
|
+
get_with_size_and_position('dcv/v2/validation', opts).map(&method(:_format_status))
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Start domain validation process. This must be called before #submit is called
|
|
23
|
+
# @option domain [String] domain to validate
|
|
24
|
+
# @option type [String] Type of validation. Must be one of 'http', 'https', 'cname',
|
|
25
|
+
# or 'email'
|
|
26
|
+
def start domain, type
|
|
27
|
+
post("dcv/v1/validation/start/domain/#{type}", domain: domain)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Retrieve DCV status for a single domain
|
|
31
|
+
# Result will included an extra 'expiration_date_obj' if 'expirationDate' is in the
|
|
32
|
+
# response
|
|
33
|
+
def status domain
|
|
34
|
+
_format_status(post('dcv/v2/validation/status', domain: domain))
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Submit domain validation for verficiation. This must be called after #start
|
|
38
|
+
# @option domain [String] domain to validate
|
|
39
|
+
# @option type [String] Type of validation. Must be one of 'http', 'https', 'cname',
|
|
40
|
+
# or 'email'
|
|
41
|
+
# @option email_address [String] This is required of +type+ is 'email'. Otherwise, it is
|
|
42
|
+
# ignored.
|
|
43
|
+
def submit domain, type, email_address = nil
|
|
44
|
+
if type.to_s == 'email'
|
|
45
|
+
raise ArgumentError, 'email_address must be specified' if email_address.nil?
|
|
46
|
+
|
|
47
|
+
post('dcv/v1/validation/submit/domain/email', domain: domain,
|
|
48
|
+
email: email_address)
|
|
49
|
+
else
|
|
50
|
+
post("dcv/v1/validation/submit/domain/#{type}", domain: domain)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def _format_status status
|
|
57
|
+
return status unless status['expirationDate']
|
|
58
|
+
|
|
59
|
+
status.merge('expiration_date_obj' =>
|
|
60
|
+
Date.strptime(status['expirationDate'], '%Y-%m-%d'))
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# A connection to the Domain API
|
|
4
|
+
class Varanus::Domain < Varanus::RestResource
|
|
5
|
+
# Create a new domain. The domain may need to be manually approved after this is
|
|
6
|
+
# called.
|
|
7
|
+
# +name+ is the domain
|
|
8
|
+
# +delegations+ is an Array of Hashes. Each Hash should have an 'orgId' and
|
|
9
|
+
# 'certTypes' key
|
|
10
|
+
# opts may include the following keys:
|
|
11
|
+
# - :description - optional - String
|
|
12
|
+
# - :active - optional - Boolean (defaults to +true+)
|
|
13
|
+
# - :allow_subdomains - optional - set to +false+ if you don't want to allow sub
|
|
14
|
+
# domains for this entry
|
|
15
|
+
#
|
|
16
|
+
# @returns [String] - URL for newly created domain
|
|
17
|
+
def create domain, delegations, opts = {}
|
|
18
|
+
opts = opts.dup
|
|
19
|
+
allow_subdomains = opts.delete(:allow_subdomains)
|
|
20
|
+
domain = "*.#{domain}" if allow_subdomains != false && !domain.start_with?('*.')
|
|
21
|
+
|
|
22
|
+
result = @varanus.connection.post('domain/v1',
|
|
23
|
+
opts.merge(name: domain, delegations: delegations))
|
|
24
|
+
check_result result
|
|
25
|
+
result.headers['Location']
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Return info on domain. +id+ must be the id returned by #list
|
|
29
|
+
def info id
|
|
30
|
+
get("domain/v1/#{id}")
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def list opts = {}
|
|
34
|
+
get_with_size_and_position('domain/v1', opts)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def list_with_info opts = {}
|
|
38
|
+
domains = list(opts)
|
|
39
|
+
domains.map! { |domain| info(domain['id']) }
|
|
40
|
+
domains
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# A connection to the Organization API
|
|
4
|
+
class Varanus::Organization < Varanus::RestResource
|
|
5
|
+
# Return info on organization.
|
|
6
|
+
def info id
|
|
7
|
+
get("organization/v1/#{id}")
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def list
|
|
11
|
+
get('organization/v1')
|
|
12
|
+
end
|
|
13
|
+
end
|
data/lib/varanus/reports.rb
CHANGED
|
@@ -18,20 +18,19 @@ class Varanus::Reports
|
|
|
18
18
|
@varanus = varanus
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
# DEPRECATED: Please use Varanus::Domain#list_with_info instead.
|
|
21
22
|
def domains
|
|
23
|
+
warn 'DEPRECATION WARNING: Varanus::Reports#domains is deprecated. ' \
|
|
24
|
+
'Use Varanus::Domain#list_with_info instead'
|
|
22
25
|
r = soap_call :get_domain_report, {}
|
|
23
26
|
format_results r[:report_row_domains]
|
|
24
27
|
end
|
|
25
28
|
|
|
26
|
-
#
|
|
27
|
-
# @param [opts] [Hash]
|
|
28
|
-
# @option opts [String, Array] :orgs Name(s) of organizations (departments) to limit
|
|
29
|
-
# the report to. If this is unset, results from all departments are returned.
|
|
30
|
-
# @option opts [Symbol] :status (:any) One of :any, :requested, :downloaded, :revoked,
|
|
31
|
-
# :expired, :pending_download, :not_enrolled. :downloaded and :pending_download
|
|
32
|
-
# mean the cert has been enrolled/signed.
|
|
33
|
-
# @return [Array<Hash>]
|
|
29
|
+
# DEPRECATED: Please use Varanus::SSL#report instead.
|
|
34
30
|
def ssl opts = {}
|
|
31
|
+
warn 'DEPRECATION WARNING: Varanus::Reports#ssl is deprecated. ' \
|
|
32
|
+
'Use Varanus::SSL#report instead'
|
|
33
|
+
|
|
35
34
|
msg = { organizationNames: nil, certificateStatus: 0 }
|
|
36
35
|
|
|
37
36
|
msg[:organizationNames] = Array(opts[:orgs]).join(',') if opts.include? :orgs
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# An abstract class for rest resources
|
|
4
|
+
# Rest resources should not be initialized directly. They should be created by methods
|
|
5
|
+
# on Varanus
|
|
6
|
+
class Varanus::RestResource
|
|
7
|
+
# :nodoc:
|
|
8
|
+
def initialize varanus
|
|
9
|
+
@varanus = varanus
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def check_result result
|
|
15
|
+
body = result.body
|
|
16
|
+
return unless body.is_a?(Hash)
|
|
17
|
+
return if body['code'].nil?
|
|
18
|
+
|
|
19
|
+
klass = Varanus::Error
|
|
20
|
+
if body['code'] == 0 && body['description'] =~ /process/
|
|
21
|
+
klass = Varanus::Error::StillProcessing
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
raise klass.new(body['code'], body['description'])
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def get path, *args
|
|
28
|
+
result = @varanus.connection.get(path, *args)
|
|
29
|
+
check_result result
|
|
30
|
+
result.body
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Performs multiple GETs with varying positions to ensure all results are returned.
|
|
34
|
+
def get_with_size_and_position path, opts = {}
|
|
35
|
+
size = opts[:size] || 200
|
|
36
|
+
position = opts[:position] || 0
|
|
37
|
+
|
|
38
|
+
results = []
|
|
39
|
+
loop do
|
|
40
|
+
params = { size: size, position: position }.merge(opts)
|
|
41
|
+
new_results = get(path, params)
|
|
42
|
+
results += new_results
|
|
43
|
+
break if new_results.length < size
|
|
44
|
+
|
|
45
|
+
position += size
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
results
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def post path, *args
|
|
52
|
+
result = @varanus.connection.post(path, *args)
|
|
53
|
+
check_result result
|
|
54
|
+
result.body
|
|
55
|
+
end
|
|
56
|
+
end
|
data/lib/varanus/ssl.rb
CHANGED
|
@@ -2,11 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
# An connection to the SSL/TSL API. This should not be initialized directly. Instead,
|
|
4
4
|
# use Varanus#ssl
|
|
5
|
-
class Varanus::SSL
|
|
6
|
-
#
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
class Varanus::SSL < Varanus::RestResource
|
|
6
|
+
# rubocop:disable Style/MutableConstant
|
|
7
|
+
# These constants are frozen, rubocop is failing to detect the freeze.
|
|
8
|
+
# See https://github.com/rubocop-hq/rubocop/issues/4406
|
|
9
|
+
REPORT_CERT_STATUS = { any: 0, requested: 1, issued: 2, revoked: 3, expired: 4 }
|
|
10
|
+
REPORT_CERT_STATUS.default_proc = proc { |_h, k|
|
|
11
|
+
raise ArgumentError, "Unknown certificateStatus: #{k.inspect}"
|
|
12
|
+
}
|
|
13
|
+
REPORT_CERT_STATUS.freeze
|
|
14
|
+
|
|
15
|
+
REPORT_CERT_DATE_ATTR = { revocation_date: 2, expiration_date: 3, request_date: 4,
|
|
16
|
+
issue_date: 5 }
|
|
17
|
+
REPORT_CERT_DATE_ATTR.default_proc = proc { |_h, k|
|
|
18
|
+
raise ArgumentError, "Unknown certificateDateAttribute: #{k.inspect}"
|
|
19
|
+
}
|
|
20
|
+
REPORT_CERT_DATE_ATTR.freeze
|
|
21
|
+
# rubocop:enable Style/MutableConstant
|
|
10
22
|
|
|
11
23
|
# Returns the option from #certificate_types that best matches the csr.
|
|
12
24
|
# @param csr [Varanus::SSL::CSR]
|
|
@@ -16,7 +28,8 @@ class Varanus::SSL
|
|
|
16
28
|
return types.first if types.length <= 1
|
|
17
29
|
|
|
18
30
|
regexp = cert_type_regexp(csr)
|
|
19
|
-
|
|
31
|
+
typ = types.find { |ct| ct['name'] =~ regexp } if regexp
|
|
32
|
+
return typ unless typ.nil?
|
|
20
33
|
|
|
21
34
|
types.find do |ct|
|
|
22
35
|
ct['name'] =~ /\bSSL\b/ && ct['name'] !~ /(?:Multi.?Domain|Wildcard)/i
|
|
@@ -26,7 +39,7 @@ class Varanus::SSL
|
|
|
26
39
|
# Certificate types that can be used to sign a cert
|
|
27
40
|
# @return [Array<Hash>]
|
|
28
41
|
def certificate_types
|
|
29
|
-
@certificate_types ||= get('types')
|
|
42
|
+
@certificate_types ||= get('ssl/v1/types')
|
|
30
43
|
end
|
|
31
44
|
|
|
32
45
|
# Return Array of certificate types based on standard sorting.
|
|
@@ -56,7 +69,37 @@ class Varanus::SSL
|
|
|
56
69
|
# @raise [Varanus::Error::StillProcessing] Cert is still being signed
|
|
57
70
|
# @return [String] Certificate
|
|
58
71
|
def collect id, type = 'x509'
|
|
59
|
-
get("collect/#{id}/#{type}")
|
|
72
|
+
get("ssl/v1/collect/#{id}/#{type}")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Returns info on the SSL certificate of the given name
|
|
76
|
+
def info id
|
|
77
|
+
get("ssl/v1/#{id}")
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# List certs ids and serial numbers
|
|
81
|
+
def list opts = {}
|
|
82
|
+
get_with_size_and_position('ssl/v1', opts)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Return a report (list) of SSL certs based on the options.
|
|
86
|
+
# The report includes a full set of details about the certs, not just the id/cn/serial
|
|
87
|
+
# +opts+ can include:
|
|
88
|
+
# (all are optional)
|
|
89
|
+
# - :organizationIds - Array - ids of organization/departments to include certs for
|
|
90
|
+
# - :certificateStatus - :any, :requested, :issued, :revoked, or :expired
|
|
91
|
+
# - :certificateDateAttribute - Specifies what fields :from and/or :to refer to.
|
|
92
|
+
# Can be: :revocation_date, :expiration_date,
|
|
93
|
+
# :request_date, or :issue_date
|
|
94
|
+
# - :from - Date - based on :certificateDateAttribute
|
|
95
|
+
# - :to - Date - based on :certificateDateAttribute
|
|
96
|
+
def report opts = { certificateStatus: :any }
|
|
97
|
+
# Default is to request any certificate status since the API call will fail if no
|
|
98
|
+
# options are passed
|
|
99
|
+
opts = { certificateStatus: :any } if opts.empty?
|
|
100
|
+
opts = _parse_report_opts(opts)
|
|
101
|
+
|
|
102
|
+
post('report/v1/ssl-certificates', opts)['reports']
|
|
60
103
|
end
|
|
61
104
|
|
|
62
105
|
# Revoke an ssl cert
|
|
@@ -64,7 +107,7 @@ class Varanus::SSL
|
|
|
64
107
|
# @param reason [String] Reason for revoking. Sectigo's API will return an error if it
|
|
65
108
|
# is blank.
|
|
66
109
|
def revoke id, reason
|
|
67
|
-
post("revoke/#{id}", reason: reason)
|
|
110
|
+
post("ssl/v1/revoke/#{id}", reason: reason)
|
|
68
111
|
nil
|
|
69
112
|
end
|
|
70
113
|
|
|
@@ -96,7 +139,7 @@ class Varanus::SSL
|
|
|
96
139
|
comments: opts[:comments].to_s[0, 1024],
|
|
97
140
|
externalRequester: opts[:external_requester].to_s[0, 512]
|
|
98
141
|
}
|
|
99
|
-
post('enroll', args)['sslId']
|
|
142
|
+
post('ssl/v1/enroll', args)['sslId']
|
|
100
143
|
end
|
|
101
144
|
|
|
102
145
|
private
|
|
@@ -109,39 +152,6 @@ class Varanus::SSL
|
|
|
109
152
|
nil
|
|
110
153
|
end
|
|
111
154
|
|
|
112
|
-
def check_result result
|
|
113
|
-
body = result.body
|
|
114
|
-
return unless body.is_a?(Hash)
|
|
115
|
-
return if body['code'].nil?
|
|
116
|
-
|
|
117
|
-
klass = Varanus::Error
|
|
118
|
-
if body['code'] == 0 && body['description'] =~ /process/
|
|
119
|
-
klass = Varanus::Error::StillProcessing
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
raise klass.new(body['code'], body['description'])
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
def connection
|
|
126
|
-
@connection ||= Faraday.new(url: 'https://cert-manager.com/api/ssl/v1',
|
|
127
|
-
request: { timeout: 300 }) do |conn|
|
|
128
|
-
conn.request :json
|
|
129
|
-
conn.response :json, content_type: /\bjson$/
|
|
130
|
-
|
|
131
|
-
conn.headers['login'] = @varanus.username
|
|
132
|
-
conn.headers['password'] = @varanus.password
|
|
133
|
-
conn.headers['customerUri'] = @varanus.customer_uri
|
|
134
|
-
|
|
135
|
-
conn.adapter Faraday.default_adapter
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
def get path
|
|
140
|
-
result = connection.get(path)
|
|
141
|
-
check_result result
|
|
142
|
-
result.body
|
|
143
|
-
end
|
|
144
|
-
|
|
145
155
|
def opts_to_cert_type_id opts, csr
|
|
146
156
|
case opts[:cert_type]
|
|
147
157
|
when Integer
|
|
@@ -153,15 +163,29 @@ class Varanus::SSL
|
|
|
153
163
|
end
|
|
154
164
|
end
|
|
155
165
|
|
|
156
|
-
def post path, *args
|
|
157
|
-
result = connection.post(path, *args)
|
|
158
|
-
check_result result
|
|
159
|
-
result.body
|
|
160
|
-
end
|
|
161
|
-
|
|
162
166
|
def opts_to_term opts, cert_type_id
|
|
163
167
|
term = opts[:days]
|
|
164
168
|
term ||= certificate_types.find { |ct| ct['id'] == cert_type_id }['terms'].min
|
|
165
169
|
term
|
|
166
170
|
end
|
|
171
|
+
|
|
172
|
+
def _parse_report_opts user_opts
|
|
173
|
+
api_opts = {}
|
|
174
|
+
user_opts.each do |key, val|
|
|
175
|
+
case key
|
|
176
|
+
when :organizationIds, :certificateRequestSource, :serialNumberFormat
|
|
177
|
+
api_opts[key] = val
|
|
178
|
+
when :from, :to
|
|
179
|
+
api_opts[key] = val.strftime('%Y-%m-%d')
|
|
180
|
+
when :certificateStatus
|
|
181
|
+
api_opts[key] = REPORT_CERT_STATUS[val]
|
|
182
|
+
when :certificateDateAttribute
|
|
183
|
+
api_opts[key] = REPORT_CERT_DATE_ATTR[val]
|
|
184
|
+
else
|
|
185
|
+
raise ArgumentError, "Unknown key: #{key.inspect}"
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
api_opts
|
|
190
|
+
end
|
|
167
191
|
end
|
data/lib/varanus/ssl/csr.rb
CHANGED
|
@@ -87,6 +87,8 @@ class Varanus::SSL::CSR
|
|
|
87
87
|
@request.public_key.n.num_bytes * 8
|
|
88
88
|
when OpenSSL::PKey::DSA
|
|
89
89
|
@request.public_key.p.num_bytes * 8
|
|
90
|
+
when OpenSSL::PKey::EC
|
|
91
|
+
@request.public_key.group.degree
|
|
90
92
|
else
|
|
91
93
|
raise "Unknown public key type: #{@request.public_key.class}"
|
|
92
94
|
end
|
data/lib/varanus/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: varanus
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sean Dilda
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-02-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -204,8 +204,12 @@ files:
|
|
|
204
204
|
- bin/setup
|
|
205
205
|
- docker-compose.yml
|
|
206
206
|
- lib/varanus.rb
|
|
207
|
+
- lib/varanus/dcv.rb
|
|
208
|
+
- lib/varanus/domain.rb
|
|
207
209
|
- lib/varanus/error.rb
|
|
210
|
+
- lib/varanus/organization.rb
|
|
208
211
|
- lib/varanus/reports.rb
|
|
212
|
+
- lib/varanus/rest_resource.rb
|
|
209
213
|
- lib/varanus/ssl.rb
|
|
210
214
|
- lib/varanus/ssl/csr.rb
|
|
211
215
|
- lib/varanus/version.rb
|