digicert 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.hound.yml +3 -0
- data/.rspec +0 -1
- data/.rubocop.yml +629 -0
- data/.sample.env +4 -0
- data/.sample.pryrc +3 -0
- data/.travis.yml +5 -2
- data/LICENSE.txt +21 -0
- data/README.md +812 -9
- data/bin/console +2 -5
- data/bin/rspec +17 -0
- data/digicert.gemspec +7 -14
- data/lib/digicert.rb +40 -2
- data/lib/digicert/actions.rb +9 -0
- data/lib/digicert/actions/all.rb +27 -0
- data/lib/digicert/actions/base.rb +11 -0
- data/lib/digicert/actions/create.rb +25 -0
- data/lib/digicert/actions/fetch.rb +21 -0
- data/lib/digicert/actions/update.rb +25 -0
- data/lib/digicert/base.rb +35 -0
- data/lib/digicert/base_order.rb +39 -0
- data/lib/digicert/certificate.rb +43 -0
- data/lib/digicert/certificate_downloader.rb +137 -0
- data/lib/digicert/certificate_request.rb +19 -0
- data/lib/digicert/client_certificate/base.rb +17 -0
- data/lib/digicert/client_certificate/digital_signature_plus.rb +13 -0
- data/lib/digicert/client_certificate/email_security_plus.rb +13 -0
- data/lib/digicert/client_certificate/premium.rb +17 -0
- data/lib/digicert/config.rb +21 -0
- data/lib/digicert/configuration.rb +26 -0
- data/lib/digicert/container.rb +35 -0
- data/lib/digicert/container_template.rb +32 -0
- data/lib/digicert/csr_generator.rb +43 -0
- data/lib/digicert/debugger.rb +34 -0
- data/lib/digicert/domain.rb +59 -0
- data/lib/digicert/duplicate_certificate.rb +21 -0
- data/lib/digicert/duplicate_certificate_finder.rb +42 -0
- data/lib/digicert/email_validation.rb +35 -0
- data/lib/digicert/errors.rb +30 -0
- data/lib/digicert/errors/forbidden.rb +9 -0
- data/lib/digicert/errors/request_error.rb +37 -0
- data/lib/digicert/errors/server_error.rb +9 -0
- data/lib/digicert/errors/unauthorized.rb +9 -0
- data/lib/digicert/expiring_order.rb +21 -0
- data/lib/digicert/findable.rb +33 -0
- data/lib/digicert/order.rb +81 -0
- data/lib/digicert/order_cancellation.rb +25 -0
- data/lib/digicert/order_duplicator.rb +11 -0
- data/lib/digicert/order_manager.rb +39 -0
- data/lib/digicert/order_reissuer.rb +11 -0
- data/lib/digicert/organization.rb +43 -0
- data/lib/digicert/product.rb +14 -0
- data/lib/digicert/request.rb +123 -0
- data/lib/digicert/response.rb +30 -0
- data/lib/digicert/ssl_certificate/base.rb +9 -0
- data/lib/digicert/ssl_certificate/ssl_ev_plus.rb +13 -0
- data/lib/digicert/ssl_certificate/ssl_plus.rb +13 -0
- data/lib/digicert/ssl_certificate/ssl_wildcard.rb +13 -0
- data/lib/digicert/version.rb +23 -1
- data/spec/acceptance/certificate_download_spec.rb +68 -0
- data/spec/acceptance/duplicating_certificate_spec.rb +86 -0
- data/spec/acceptance/reissuing_certificate_spec.rb +104 -0
- data/spec/digicert/actions/all_spec.rb +26 -0
- data/spec/digicert/actions/create_spec.rb +47 -0
- data/spec/digicert/actions/fetch_spec.rb +28 -0
- data/spec/digicert/actions/update_spec.rb +39 -0
- data/spec/digicert/certificate_downloader_spec.rb +89 -0
- data/spec/digicert/certificate_request_spec.rb +49 -0
- data/spec/digicert/certificate_spec.rb +93 -0
- data/spec/digicert/client_certificate/digital_signature_plus_spec.rb +32 -0
- data/spec/digicert/client_certificate/email_security_plus_spec.rb +36 -0
- data/spec/digicert/client_certificate/premium_spec.rb +34 -0
- data/spec/digicert/config_spec.rb +39 -0
- data/spec/digicert/container_spec.rb +44 -0
- data/spec/digicert/container_template_spec.rb +32 -0
- data/spec/digicert/csr_generator_spec.rb +31 -0
- data/spec/digicert/domain_spec.rb +89 -0
- data/spec/digicert/duplicate_certificate_finder_spec.rb +27 -0
- data/spec/digicert/duplicate_certificate_spec.rb +15 -0
- data/spec/digicert/email_validation_spec.rb +26 -0
- data/spec/digicert/expiring_order_spec.rb +16 -0
- data/spec/digicert/findable_spec.rb +19 -0
- data/spec/digicert/order_cancellation_spec.rb +24 -0
- data/spec/digicert/order_duplicator_spec.rb +35 -0
- data/spec/digicert/order_reissuer_spec.rb +35 -0
- data/spec/digicert/order_spec.rb +134 -0
- data/spec/digicert/organization_spec.rb +61 -0
- data/spec/digicert/product_spec.rb +28 -0
- data/spec/digicert/request_spec.rb +47 -0
- data/spec/digicert/ssl_certificate/ssl_ev_plus_spec.rb +35 -0
- data/spec/digicert/ssl_certificate/ssl_plus_spec.rb +36 -0
- data/spec/digicert/ssl_certificate/ssl_wildcard_spec.rb +35 -0
- data/spec/fixtures/certificate.pem +79 -0
- data/spec/fixtures/certificate.zip +0 -0
- data/spec/fixtures/certificate_request.json +116 -0
- data/spec/fixtures/certificate_requests.json +59 -0
- data/spec/fixtures/certificate_revoked.json +13 -0
- data/spec/fixtures/container.json +15 -0
- data/spec/fixtures/container_created.json +3 -0
- data/spec/fixtures/container_template.json +15 -0
- data/spec/fixtures/container_templates.json +14 -0
- data/spec/fixtures/containers.json +14 -0
- data/spec/fixtures/domain.json +71 -0
- data/spec/fixtures/domain_created.json +3 -0
- data/spec/fixtures/domains.json +49 -0
- data/spec/fixtures/email_validations.json +17 -0
- data/spec/fixtures/empty.json +0 -0
- data/spec/fixtures/errors.json +6 -0
- data/spec/fixtures/expiring_orders.json +20 -0
- data/spec/fixtures/order.json +107 -0
- data/spec/fixtures/order_created.json +9 -0
- data/spec/fixtures/order_duplicated.json +8 -0
- data/spec/fixtures/order_duplications.json +57 -0
- data/spec/fixtures/order_reissued.json +8 -0
- data/spec/fixtures/orders.json +93 -0
- data/spec/fixtures/organization.json +35 -0
- data/spec/fixtures/organization_created.json +3 -0
- data/spec/fixtures/organizations.json +84 -0
- data/spec/fixtures/ping.json +3 -0
- data/spec/fixtures/product.json +71 -0
- data/spec/fixtures/products.json +100 -0
- data/spec/fixtures/rsa4096.key +51 -0
- data/spec/requests/certificate_duplication_spec.rb +41 -0
- data/spec/requests/certificate_generation_spec.rb +93 -0
- data/spec/requests/certificate_reissuing_spec.rb +38 -0
- data/spec/requests/container_management_spec.rb +36 -0
- data/spec/requests/domain_management_spec.rb +64 -0
- data/spec/requests/order_client_email_security_plus_spec.rb +38 -0
- data/spec/requests/order_management_spec.rb +24 -0
- data/spec/requests/order_ssl_ev_plus_spec.rb +57 -0
- data/spec/requests/order_ssl_wildcard_spec.rb +57 -0
- data/spec/requests/organization_management_spec.rb +22 -0
- data/spec/requests/product_management_spec.rb +24 -0
- data/spec/requests/request_management_spec.rb +24 -0
- data/spec/spec_helper.rb +35 -0
- data/spec/support/fake_digicert_api.rb +324 -0
- metadata +162 -5
@@ -0,0 +1,19 @@
|
|
1
|
+
require "digicert/base"
|
2
|
+
|
3
|
+
module Digicert
|
4
|
+
class CertificateRequest < Digicert::Base
|
5
|
+
include Digicert::Actions::All
|
6
|
+
include Digicert::Actions::Fetch
|
7
|
+
include Digicert::Actions::Update
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def resource_path
|
12
|
+
"request"
|
13
|
+
end
|
14
|
+
|
15
|
+
def resource_update_path
|
16
|
+
[resource_path, resource_id, "status"].join("/")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "digicert/base_order"
|
2
|
+
|
3
|
+
module Digicert
|
4
|
+
module ClientCertificate
|
5
|
+
class Base < Digicert::BaseOrder
|
6
|
+
private
|
7
|
+
|
8
|
+
def validate_certificate(common_name:, signature_hash:, emails:, **attrs)
|
9
|
+
attrs.merge(
|
10
|
+
emails: emails,
|
11
|
+
common_name: common_name,
|
12
|
+
signature_hash: signature_hash,
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "digicert/client_certificate/base"
|
2
|
+
|
3
|
+
module Digicert
|
4
|
+
module ClientCertificate
|
5
|
+
class Premium < Digicert::ClientCertificate::Base
|
6
|
+
private
|
7
|
+
|
8
|
+
def certificate_type
|
9
|
+
"client_premium_sha2"
|
10
|
+
end
|
11
|
+
|
12
|
+
def validate_certificate(csr:, **attributes)
|
13
|
+
super(attributes.merge(csr: csr))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "digicert/configuration"
|
2
|
+
|
3
|
+
module Digicert
|
4
|
+
module Config
|
5
|
+
def configure
|
6
|
+
if block_given?
|
7
|
+
yield configuration
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def configuration
|
12
|
+
@configuration ||= Configuration.new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Expose config module methods as class level method,
|
17
|
+
# so we can use those method whenever necessary, specially
|
18
|
+
# the `configuration` throughout the gem
|
19
|
+
#
|
20
|
+
extend Config
|
21
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Digicert
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :api_key, :api_host, :base_path, :response_type, :debug_mode
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@api_host = "www.digicert.com"
|
7
|
+
@base_path = "services/v2"
|
8
|
+
@response_type = :object
|
9
|
+
@debug_mode = false
|
10
|
+
end
|
11
|
+
|
12
|
+
def response_klass
|
13
|
+
response_klasses[response_type.to_sym] || ResponseObject
|
14
|
+
end
|
15
|
+
|
16
|
+
def debug_mode?
|
17
|
+
debug_mode == true
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def response_klasses
|
23
|
+
{ hash: Hash, object: ResponseObject }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "digicert/base"
|
2
|
+
|
3
|
+
module Digicert
|
4
|
+
class Container < Digicert::Base
|
5
|
+
include Digicert::Actions::All
|
6
|
+
include Digicert::Actions::Fetch
|
7
|
+
include Digicert::Actions::Create
|
8
|
+
|
9
|
+
def self.create(container_id:, **attributes)
|
10
|
+
new(attributes.merge(container_id: container_id)).create
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def extract_local_attribute_ids
|
16
|
+
@container_id = attributes.delete(:container_id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def validate(name:, template_id:, **attributes)
|
20
|
+
required_attributes = {
|
21
|
+
name: name, template_id: template_id
|
22
|
+
}
|
23
|
+
|
24
|
+
required_attributes.merge(attributes)
|
25
|
+
end
|
26
|
+
|
27
|
+
def resource_path
|
28
|
+
"container"
|
29
|
+
end
|
30
|
+
|
31
|
+
def resource_creation_path
|
32
|
+
[resource_path, @container_id, "children"].join("/")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "digicert/base"
|
2
|
+
|
3
|
+
module Digicert
|
4
|
+
class ContainerTemplate < Digicert::Base
|
5
|
+
include Digicert::Actions::All
|
6
|
+
include Digicert::Actions::Fetch
|
7
|
+
|
8
|
+
def self.all(container_id)
|
9
|
+
new(container_id: container_id).all
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.fetch(template_id:, container_id:)
|
13
|
+
new(resource_id: template_id, container_id: container_id).fetch
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_reader :container_id
|
19
|
+
|
20
|
+
def extract_local_attribute_ids
|
21
|
+
@container_id = attributes.delete(:container_id)
|
22
|
+
end
|
23
|
+
|
24
|
+
def resources_key
|
25
|
+
"container_templates"
|
26
|
+
end
|
27
|
+
|
28
|
+
def resource_path
|
29
|
+
["container", container_id, "template"].join("/")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require "r509"
|
2
|
+
|
3
|
+
module Digicert
|
4
|
+
class CSRGenerator
|
5
|
+
def initialize(common_name:, organization:, san_names: [], rsa_key: nil)
|
6
|
+
@rsa_key = rsa_key
|
7
|
+
@common_name = common_name
|
8
|
+
@san_names = san_names
|
9
|
+
@organization = organization
|
10
|
+
end
|
11
|
+
|
12
|
+
def generate
|
13
|
+
create_r509_csr.to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.generate(attributes)
|
17
|
+
new(attributes).generate
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :organization, :common_name, :san_names, :rsa_key
|
23
|
+
|
24
|
+
def create_r509_csr
|
25
|
+
R509::CSR.new(r509_attributes_hash)
|
26
|
+
end
|
27
|
+
|
28
|
+
def r509_attributes_hash
|
29
|
+
{ key: rsa_key, subject: subject_items, san_names: san_names }.
|
30
|
+
reject { |key, value| value.nil? || value.empty? }
|
31
|
+
end
|
32
|
+
|
33
|
+
def subject_items
|
34
|
+
[
|
35
|
+
["CN", common_name],
|
36
|
+
["C", organization.country],
|
37
|
+
["ST", organization.state],
|
38
|
+
["L", organization.city],
|
39
|
+
["O", organization.name],
|
40
|
+
]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Digicert
|
2
|
+
class Debugger
|
3
|
+
def initialize(request:, response:)
|
4
|
+
@request = request
|
5
|
+
@response = response
|
6
|
+
end
|
7
|
+
|
8
|
+
def debug
|
9
|
+
puts "[API Reqeust Begin]".center(50, "=")
|
10
|
+
puts api_request_details
|
11
|
+
puts api_response_details
|
12
|
+
puts "[API Reqeust End]".center(50, "=")
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :request, :response
|
18
|
+
|
19
|
+
def api_request_details
|
20
|
+
uri = ["[URI]", request.method, request.uri].join(" ")
|
21
|
+
headers = "[Headers] " + request.to_hash.to_s
|
22
|
+
body = "[Request Body] " + request.body.to_json if request.body
|
23
|
+
|
24
|
+
[uri, headers, body].join("\n")
|
25
|
+
end
|
26
|
+
|
27
|
+
def api_response_details
|
28
|
+
response_object = "[Response] " + response.inspect
|
29
|
+
body = "[Response Body] " + response.body if response.body
|
30
|
+
|
31
|
+
[response_object, body].join("\n")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require "digicert/base"
|
2
|
+
require "digicert/findable"
|
3
|
+
|
4
|
+
module Digicert
|
5
|
+
class Domain < Digicert::Base
|
6
|
+
extend Digicert::Findable
|
7
|
+
|
8
|
+
include Digicert::Actions::All
|
9
|
+
include Digicert::Actions::Fetch
|
10
|
+
include Digicert::Actions::Create
|
11
|
+
|
12
|
+
def activate
|
13
|
+
request_klass.new(
|
14
|
+
:put, [resource_path, resource_id, "activate"].join("/"),
|
15
|
+
).parse
|
16
|
+
end
|
17
|
+
|
18
|
+
def deactivate
|
19
|
+
request_klass.new(
|
20
|
+
:put, [resource_path, resource_id, "deactivate"].join("/"),
|
21
|
+
).parse
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def resource_path
|
27
|
+
"domain"
|
28
|
+
end
|
29
|
+
|
30
|
+
def validate_validations(attributes)
|
31
|
+
attributes.map do |attribute|
|
32
|
+
validate_validation(attribute)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Validate validation
|
37
|
+
#
|
38
|
+
# We need to provide a valid type of valitations when creating a new domain,
|
39
|
+
# but the most important thing about the types are it has to be in lowercase
|
40
|
+
# format, otherwise Digicert won't accept it a valid type. So let's ensure
|
41
|
+
# we are always providig the type in correct format.
|
42
|
+
#
|
43
|
+
# Ref: https://www.digicert.com/services/v2/documentation/appendix-validation-types
|
44
|
+
#
|
45
|
+
def validate_validation(type:, **attributes)
|
46
|
+
{ type: type.downcase }.merge(attributes)
|
47
|
+
end
|
48
|
+
|
49
|
+
def validate(name:, organization:, validations:, **attributes)
|
50
|
+
required_attributes = {
|
51
|
+
name: name,
|
52
|
+
organization: organization,
|
53
|
+
validations: validate_validations(validations)
|
54
|
+
}
|
55
|
+
|
56
|
+
required_attributes.merge(attributes)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "digicert/base"
|
2
|
+
|
3
|
+
module Digicert
|
4
|
+
class DuplicateCertificate < Digicert::Base
|
5
|
+
include Digicert::Actions::All
|
6
|
+
|
7
|
+
def self.all(order_id:, **attributes)
|
8
|
+
new(resource_id: order_id, **attributes).all
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def resources_key
|
14
|
+
"certificates"
|
15
|
+
end
|
16
|
+
|
17
|
+
def resource_path
|
18
|
+
["order", "certificate", resource_id, "duplicate"].join("/")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Digicert
|
2
|
+
class DuplicateCertificateFinder
|
3
|
+
def initialize(request_id:)
|
4
|
+
@request_id = request_id
|
5
|
+
end
|
6
|
+
|
7
|
+
def find
|
8
|
+
certificate_by_date_created
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.find_by(request_id:)
|
12
|
+
new(request_id: request_id).find
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :request_id
|
18
|
+
|
19
|
+
def certificate_by_date_created
|
20
|
+
certificates_by_date_created.first
|
21
|
+
end
|
22
|
+
|
23
|
+
def certificates_by_date_created
|
24
|
+
duplicate_certificates.select do |certificate|
|
25
|
+
certificate.date_created == request_created_at
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def duplicate_certificates
|
30
|
+
@duplicate_certificates ||=
|
31
|
+
Digicert::DuplicateCertificate.all(order_id: request.order.id)
|
32
|
+
end
|
33
|
+
|
34
|
+
def request_created_at
|
35
|
+
request.order.certificate.date_created
|
36
|
+
end
|
37
|
+
|
38
|
+
def request
|
39
|
+
@request ||= Digicert::CertificateRequest.fetch(request_id)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "digicert/base"
|
2
|
+
|
3
|
+
module Digicert
|
4
|
+
class EmailValidation < Digicert::Base
|
5
|
+
include Digicert::Actions::All
|
6
|
+
|
7
|
+
def self.all(order_id:, **filter_params)
|
8
|
+
new(order_id: order_id, params: filter_params).all
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.valid?(token:, email:)
|
12
|
+
response = Digicert::Request.new(
|
13
|
+
:put, ["email-validation", token].join("/"), params: {email: email }
|
14
|
+
).run
|
15
|
+
|
16
|
+
response.code.to_i == 204
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :order_id
|
22
|
+
|
23
|
+
def extract_local_attribute_ids
|
24
|
+
@order_id = attributes.delete(:order_id)
|
25
|
+
end
|
26
|
+
|
27
|
+
def resources_key
|
28
|
+
"emails"
|
29
|
+
end
|
30
|
+
|
31
|
+
def resource_path
|
32
|
+
["order", "certificate", order_id, "email-validation"].join("/")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|