digicert 0.1.0 → 0.1.1

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.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.hound.yml +3 -0
  4. data/.rspec +0 -1
  5. data/.rubocop.yml +629 -0
  6. data/.sample.env +4 -0
  7. data/.sample.pryrc +3 -0
  8. data/.travis.yml +5 -2
  9. data/LICENSE.txt +21 -0
  10. data/README.md +812 -9
  11. data/bin/console +2 -5
  12. data/bin/rspec +17 -0
  13. data/digicert.gemspec +7 -14
  14. data/lib/digicert.rb +40 -2
  15. data/lib/digicert/actions.rb +9 -0
  16. data/lib/digicert/actions/all.rb +27 -0
  17. data/lib/digicert/actions/base.rb +11 -0
  18. data/lib/digicert/actions/create.rb +25 -0
  19. data/lib/digicert/actions/fetch.rb +21 -0
  20. data/lib/digicert/actions/update.rb +25 -0
  21. data/lib/digicert/base.rb +35 -0
  22. data/lib/digicert/base_order.rb +39 -0
  23. data/lib/digicert/certificate.rb +43 -0
  24. data/lib/digicert/certificate_downloader.rb +137 -0
  25. data/lib/digicert/certificate_request.rb +19 -0
  26. data/lib/digicert/client_certificate/base.rb +17 -0
  27. data/lib/digicert/client_certificate/digital_signature_plus.rb +13 -0
  28. data/lib/digicert/client_certificate/email_security_plus.rb +13 -0
  29. data/lib/digicert/client_certificate/premium.rb +17 -0
  30. data/lib/digicert/config.rb +21 -0
  31. data/lib/digicert/configuration.rb +26 -0
  32. data/lib/digicert/container.rb +35 -0
  33. data/lib/digicert/container_template.rb +32 -0
  34. data/lib/digicert/csr_generator.rb +43 -0
  35. data/lib/digicert/debugger.rb +34 -0
  36. data/lib/digicert/domain.rb +59 -0
  37. data/lib/digicert/duplicate_certificate.rb +21 -0
  38. data/lib/digicert/duplicate_certificate_finder.rb +42 -0
  39. data/lib/digicert/email_validation.rb +35 -0
  40. data/lib/digicert/errors.rb +30 -0
  41. data/lib/digicert/errors/forbidden.rb +9 -0
  42. data/lib/digicert/errors/request_error.rb +37 -0
  43. data/lib/digicert/errors/server_error.rb +9 -0
  44. data/lib/digicert/errors/unauthorized.rb +9 -0
  45. data/lib/digicert/expiring_order.rb +21 -0
  46. data/lib/digicert/findable.rb +33 -0
  47. data/lib/digicert/order.rb +81 -0
  48. data/lib/digicert/order_cancellation.rb +25 -0
  49. data/lib/digicert/order_duplicator.rb +11 -0
  50. data/lib/digicert/order_manager.rb +39 -0
  51. data/lib/digicert/order_reissuer.rb +11 -0
  52. data/lib/digicert/organization.rb +43 -0
  53. data/lib/digicert/product.rb +14 -0
  54. data/lib/digicert/request.rb +123 -0
  55. data/lib/digicert/response.rb +30 -0
  56. data/lib/digicert/ssl_certificate/base.rb +9 -0
  57. data/lib/digicert/ssl_certificate/ssl_ev_plus.rb +13 -0
  58. data/lib/digicert/ssl_certificate/ssl_plus.rb +13 -0
  59. data/lib/digicert/ssl_certificate/ssl_wildcard.rb +13 -0
  60. data/lib/digicert/version.rb +23 -1
  61. data/spec/acceptance/certificate_download_spec.rb +68 -0
  62. data/spec/acceptance/duplicating_certificate_spec.rb +86 -0
  63. data/spec/acceptance/reissuing_certificate_spec.rb +104 -0
  64. data/spec/digicert/actions/all_spec.rb +26 -0
  65. data/spec/digicert/actions/create_spec.rb +47 -0
  66. data/spec/digicert/actions/fetch_spec.rb +28 -0
  67. data/spec/digicert/actions/update_spec.rb +39 -0
  68. data/spec/digicert/certificate_downloader_spec.rb +89 -0
  69. data/spec/digicert/certificate_request_spec.rb +49 -0
  70. data/spec/digicert/certificate_spec.rb +93 -0
  71. data/spec/digicert/client_certificate/digital_signature_plus_spec.rb +32 -0
  72. data/spec/digicert/client_certificate/email_security_plus_spec.rb +36 -0
  73. data/spec/digicert/client_certificate/premium_spec.rb +34 -0
  74. data/spec/digicert/config_spec.rb +39 -0
  75. data/spec/digicert/container_spec.rb +44 -0
  76. data/spec/digicert/container_template_spec.rb +32 -0
  77. data/spec/digicert/csr_generator_spec.rb +31 -0
  78. data/spec/digicert/domain_spec.rb +89 -0
  79. data/spec/digicert/duplicate_certificate_finder_spec.rb +27 -0
  80. data/spec/digicert/duplicate_certificate_spec.rb +15 -0
  81. data/spec/digicert/email_validation_spec.rb +26 -0
  82. data/spec/digicert/expiring_order_spec.rb +16 -0
  83. data/spec/digicert/findable_spec.rb +19 -0
  84. data/spec/digicert/order_cancellation_spec.rb +24 -0
  85. data/spec/digicert/order_duplicator_spec.rb +35 -0
  86. data/spec/digicert/order_reissuer_spec.rb +35 -0
  87. data/spec/digicert/order_spec.rb +134 -0
  88. data/spec/digicert/organization_spec.rb +61 -0
  89. data/spec/digicert/product_spec.rb +28 -0
  90. data/spec/digicert/request_spec.rb +47 -0
  91. data/spec/digicert/ssl_certificate/ssl_ev_plus_spec.rb +35 -0
  92. data/spec/digicert/ssl_certificate/ssl_plus_spec.rb +36 -0
  93. data/spec/digicert/ssl_certificate/ssl_wildcard_spec.rb +35 -0
  94. data/spec/fixtures/certificate.pem +79 -0
  95. data/spec/fixtures/certificate.zip +0 -0
  96. data/spec/fixtures/certificate_request.json +116 -0
  97. data/spec/fixtures/certificate_requests.json +59 -0
  98. data/spec/fixtures/certificate_revoked.json +13 -0
  99. data/spec/fixtures/container.json +15 -0
  100. data/spec/fixtures/container_created.json +3 -0
  101. data/spec/fixtures/container_template.json +15 -0
  102. data/spec/fixtures/container_templates.json +14 -0
  103. data/spec/fixtures/containers.json +14 -0
  104. data/spec/fixtures/domain.json +71 -0
  105. data/spec/fixtures/domain_created.json +3 -0
  106. data/spec/fixtures/domains.json +49 -0
  107. data/spec/fixtures/email_validations.json +17 -0
  108. data/spec/fixtures/empty.json +0 -0
  109. data/spec/fixtures/errors.json +6 -0
  110. data/spec/fixtures/expiring_orders.json +20 -0
  111. data/spec/fixtures/order.json +107 -0
  112. data/spec/fixtures/order_created.json +9 -0
  113. data/spec/fixtures/order_duplicated.json +8 -0
  114. data/spec/fixtures/order_duplications.json +57 -0
  115. data/spec/fixtures/order_reissued.json +8 -0
  116. data/spec/fixtures/orders.json +93 -0
  117. data/spec/fixtures/organization.json +35 -0
  118. data/spec/fixtures/organization_created.json +3 -0
  119. data/spec/fixtures/organizations.json +84 -0
  120. data/spec/fixtures/ping.json +3 -0
  121. data/spec/fixtures/product.json +71 -0
  122. data/spec/fixtures/products.json +100 -0
  123. data/spec/fixtures/rsa4096.key +51 -0
  124. data/spec/requests/certificate_duplication_spec.rb +41 -0
  125. data/spec/requests/certificate_generation_spec.rb +93 -0
  126. data/spec/requests/certificate_reissuing_spec.rb +38 -0
  127. data/spec/requests/container_management_spec.rb +36 -0
  128. data/spec/requests/domain_management_spec.rb +64 -0
  129. data/spec/requests/order_client_email_security_plus_spec.rb +38 -0
  130. data/spec/requests/order_management_spec.rb +24 -0
  131. data/spec/requests/order_ssl_ev_plus_spec.rb +57 -0
  132. data/spec/requests/order_ssl_wildcard_spec.rb +57 -0
  133. data/spec/requests/organization_management_spec.rb +22 -0
  134. data/spec/requests/product_management_spec.rb +24 -0
  135. data/spec/requests/request_management_spec.rb +24 -0
  136. data/spec/spec_helper.rb +35 -0
  137. data/spec/support/fake_digicert_api.rb +324 -0
  138. metadata +162 -5
data/.sample.env ADDED
@@ -0,0 +1,4 @@
1
+ DIGICERT_CONTAINER_ID=YOUR_CONTAINER_ID
2
+ DIGICERT_ORGANIZATION_ID=YOUR_ORGANIZATION_ID
3
+ DIGICERT_ADMINISTRATOR_ID=USER_ID_WITH_PRIVILEGE
4
+ SECRET_DEV_API_KEY=YOUR_API_KEY
data/.sample.pryrc ADDED
@@ -0,0 +1,3 @@
1
+ Digicert.configure do |config|
2
+ config.api_key = "YOUR_DEV_API_KEY"
3
+ end
data/.travis.yml CHANGED
@@ -1,5 +1,8 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.3.3
5
- before_install: gem install bundler -v 1.14.3
4
+ - 2.4.1
5
+ - 2.3.1
6
+ - 2.2.0
7
+ - 2.1.9
8
+ before_install: gem install bundler -v 1.14.6
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Ribose Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1,36 +1,839 @@
1
1
  # Digicert
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/digicert`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ [![Build
4
+ Status](https://travis-ci.org/riboseinc/digicert.svg?branch=master)](https://travis-ci.org/riboseinc/digicert)
5
+ [![Code
6
+ Climate](https://codeclimate.com/github/riboseinc/digicert/badges/gpa.svg)](https://codeclimate.com/github/riboseinc/digicert)
4
7
 
5
- TODO: Delete this and the text above, and describe your gem
8
+ The Ruby client for the official Digicert API.
6
9
 
7
10
  ## Installation
8
11
 
9
12
  Add this line to your application's Gemfile:
10
13
 
11
14
  ```ruby
12
- gem 'digicert'
15
+ gem "digicert"
13
16
  ```
14
17
 
15
18
  And then execute:
16
19
 
17
- $ bundle
20
+ ```sh
21
+ bundle install
22
+ ```
18
23
 
19
24
  Or install it yourself as:
20
25
 
21
- $ gem install digicert
26
+ ```sh
27
+ gem install digicert
28
+ ```
29
+
30
+ ## Configure
31
+
32
+ Once you have your API key then you can configure it by adding an initializer
33
+ with the following code
34
+
35
+ ```ruby
36
+ Digicert.configure do |config|
37
+ config.api_key = "SECRET_DEV_API_KEY"
38
+
39
+ # Default response type is `object`, but you can configure it if
40
+ # necessary, and all the further response will be return as config
41
+ # supported options are `object` and `hash`.
42
+ #
43
+ # config.response_type = :object
44
+ end
45
+ ```
46
+
47
+ Or
48
+
49
+ ```ruby
50
+ Digicert.configuration.api_key = "SECRET_DEV_API_KEY"
51
+ ```
22
52
 
23
53
  ## Usage
24
54
 
25
- TODO: Write usage instructions here
55
+ ### Container
56
+
57
+ Container is an Operational Division used to model your organizational
58
+ structure. The features of the container you create are determined by
59
+ its Container Template.
60
+
61
+ #### List Containers
62
+
63
+ Use this interface to retrieve a list of existing containers.
64
+
65
+ Note: This is an undocumented endpoint of the DigiCert Services API.
66
+
67
+ ```ruby
68
+ Digicert::Container.all
69
+ ```
70
+
71
+ #### Create a Container
72
+
73
+ Use this interface to create new container, and this interface also
74
+ expects us to provide `parent_container` along with the others
75
+ attributes as `container_id`.
76
+
77
+ ```ruby
78
+ Digicert::Container.create(
79
+ container_id: 123_456_789,
80
+ template_id: 5,
81
+ name: "History Department",
82
+ description: "History, Civ, Ancient Languages",
83
+
84
+ user: {
85
+ first_name: "Awesome",
86
+ last_name: "User",
87
+ email: "awesomeuser@example.com",
88
+ username: "awesomeuser@example.com",
89
+ access_roles: [{ id: 1 }],
90
+ },
91
+ )
92
+ ```
93
+
94
+ #### View a Container
95
+
96
+ Information about a specific container can be retrieved through this interface,
97
+ including its name, description, template, and parent container id.
98
+
99
+ ```ruby
100
+ Digicert::Container.fetch(container_id)
101
+ ```
102
+
103
+ ### Container Template
104
+
105
+ Container Templates define a set of features that are available to a container.
106
+
107
+ #### List Container Templates
108
+
109
+ Use this interface to retrieve a list of the templates that are available to use
110
+ to create child containers.
111
+
112
+ ```ruby
113
+ Digicert::ContainerTemplate.all(container_id)
114
+ ```
115
+
116
+ #### View a Container Template
117
+
118
+ Use this interface to retrieve information about a specific container template,
119
+ including which user access roles are available under this template.
120
+
121
+ ```ruby
122
+ Digicert::ContainerTemplate.fetch(
123
+ template_id: template_id, container_id: container_id,
124
+ )
125
+ ```
126
+
127
+ ### Organization
128
+
129
+ #### Create an Organization
130
+
131
+ Use this interface to create a new organization. The organization information
132
+ will be used by DigiCert for validation and may appear on certificates.
133
+
134
+ ```ruby
135
+ # Create a new organization
136
+ # Please pay close attension bellow
137
+ # on building the organization_attributes
138
+ #
139
+ Digicert::Organization.create(organization_attributes)
140
+
141
+ # Organization attributes hash
142
+ #
143
+ organization_attributes = {
144
+ name: "digicert, inc.",
145
+ address: "333 s 520 w",
146
+ zip: 84042,
147
+ city: "lindon",
148
+ state: "utah",
149
+ country: "us",
150
+ telephone: 8015551212,
151
+ container: { id: 17 },
152
+
153
+ organization_contact: {
154
+ first_name: "Some",
155
+ last_name: "Guy",
156
+ email: "someguy@digicert.com",
157
+ telephone: 8015551212,
158
+ },
159
+
160
+ # Optional attributes
161
+ assumed_name: "DigiCert",
162
+ address2: "Suite 500",
163
+ }
164
+ ```
165
+
166
+ #### View an Organization
167
+
168
+ Use this interface to view information about an organization.
169
+
170
+ ```ruby
171
+ Digicert::Organization.fetch(organization_id)
172
+ ```
173
+
174
+ #### List all organizations
175
+
176
+ Use this interface to retrieve a list of organizations.
177
+
178
+ ```ruby
179
+ Digicert::Organization.all
180
+ ```
181
+
182
+ ### Domain
183
+
184
+ #### Create a new Domain
185
+
186
+ Use this interface to add a domain for an organization in a container. You must
187
+ specify at least one validation type for the domain.
188
+
189
+ ```ruby
190
+ # Create a new domain in an organization
191
+ # Please pay close attension in building the attibutes hash
192
+ #
193
+ Digicert::Domain.create(domain_attributes)
194
+
195
+ # Domain attributes hash
196
+ #
197
+ domain_attributes = {
198
+ name: "digicert.com",
199
+ organization: { id: 117483 },
200
+ validations: [
201
+ {
202
+ type: "ev",
203
+ user: { id: 12 }
204
+ },
205
+ ],
206
+
207
+ dcv: { method: "email" },
208
+ }
209
+ ```
210
+
211
+ #### Activate a Domain
212
+
213
+ Use this interface to activate a domain that was previously deactivated.
214
+
215
+ ```ruby
216
+ domain = Digicert::Domain.find(domain_id)
217
+ domain.activate
218
+ ```
219
+
220
+ #### Deactivate a Domain
221
+
222
+ Use this interface to deactivate a domain.
223
+
224
+ ```ruby
225
+ domain = Digicert::Domain.find(domain_id)
226
+ domain.deactivate
227
+ ```
228
+
229
+ #### View a Domain
230
+
231
+ Use this interface to view a domain, This interface also allows you to pass an
232
+ additional `hash` to specify if you want to retrieve additional data with the
233
+ response.
234
+
235
+ ```ruby
236
+ Digicert::Domain.fetch(domain_id, include_dcv: true)
237
+ ```
238
+
239
+ #### List Domains
240
+
241
+ Use this interface to retrieve a list of domains. This interface also supports
242
+ an additional `filter_params` hash, which can be used to filter the list we want
243
+ the interface to return.
244
+
245
+ ```ruby
246
+ Digicert::Domain.all(filter_params_hash)
247
+ ```
248
+
249
+ ### Submitting Orders
250
+
251
+ #### View Product List
252
+
253
+ Use this interface to retrieve a list of available products for an account.
254
+
255
+ ```ruby
256
+ Digicert::Product.all
257
+ ```
258
+
259
+ #### View Product Details
260
+
261
+ Use this interface to retrieve a full set of details for a product.
262
+
263
+ ```ruby
264
+ Digicert::Product.fetch(name_id)
265
+ ```
266
+
267
+ #### Generate the CSR content
268
+
269
+ This interface will allow us to generate the CSR content on the fly, it will
270
+ return the content that we can use for order creation.
271
+
272
+ ```ruby
273
+ Digicert::CSRGenerator.generate(
274
+ common_name: "example.com",
275
+ san_names: ["example.com", "www.example.com"],
276
+ rsa_key: File.read("your_rsa_key_file_path"),
277
+ organization: Digicert::Organization.first,
278
+ )
279
+ ```
280
+
281
+ #### Create any type of order
282
+
283
+ Use this interface to create a new order, this expect two arguments one is
284
+ `name_id` for the order and another one is the attributes hash.
285
+
286
+ ```ruby
287
+ order = Digicert::Order.create(
288
+ name_id, order_attributes_hash,
289
+ )
290
+
291
+ # Pay close attension building the order attributes
292
+ # hash, it requries to format the data in a specific
293
+ # format and once that is satisfied only then it will
294
+ # perfrom the API operation otherwise it will raise
295
+ # invalid argument errors.
296
+ #
297
+ order_attributes = {
298
+ certificate: {
299
+ common_name: "digicert.com",
300
+ csr: "------ [CSR HERE] ------",
301
+ signature_hash: "sha256",
302
+
303
+ organization_units: ["Developer Operations"],
304
+ server_platform: { id: 45 },
305
+ profile_option: "some_ssl_profile",
306
+ },
307
+
308
+ organization: { id: 117483 },
309
+ validity_years: 3,
310
+ custom_expiration_date: "2017-05-18",
311
+ comments: "Comments for the the approver",
312
+ disable_renewal_notifications: false,
313
+ renewal_of_order_id: 314152,
314
+ payment_method: "balance",
315
+ }
316
+ ```
317
+
318
+ The supported value for `name_id` are `ssl_plus`, `ssl_wildcard`, `ssl_ev_plus`,
319
+ `client_premium`, `email_security_plus` and `digital_signature_plus`. Please
320
+ check the Digicert documentation for more details on those.
321
+
322
+ If you want to create a new order by yourself by following each of the specific
323
+ class then please check out the interfaces specified bellow.
324
+
325
+ #### Order SSL Plus Certificate
326
+
327
+ Use this interface to order a SSL Plus Certificate.
328
+
329
+ ```ruby
330
+ Digicert::SSLCertificate::SSLPlus.create(
331
+ certificate: {
332
+ common_name: "digicert.com",
333
+ csr: "------ [CSR HERE] ------",
334
+ signature_hash: "sha256",
335
+
336
+ organization_units: ["Developer Operations"],
337
+ server_platform: { id: 45 },
338
+ profile_option: "some_ssl_profile",
339
+ },
340
+
341
+ organization: { id: 117483 },
342
+ validity_years: 3,
343
+ custom_expiration_date: "2017-05-18",
344
+ comments: "Comments for the the approver",
345
+ disable_renewal_notifications: false,
346
+ renewal_of_order_id: 314152,
347
+ payment_method: "balance",
348
+ )
349
+ ```
350
+
351
+ #### Order SSL Wildcard Certificate
352
+
353
+ Use this interface to order a SSL Wildcard Certificate.
354
+
355
+ ```ruby
356
+ Digicert::SSLCertificate::SSLWildcard.create(
357
+ certificate: {
358
+ common_name: "digicert.com",
359
+ csr: "------ [CSR HERE] ------",
360
+ signature_hash: "sha256",
361
+
362
+ organization_units: ["Developer Operations"],
363
+ server_platform: { id: 45 },
364
+ profile_option: "some_ssl_profile",
365
+ },
366
+
367
+ organization: { id: 117483 },
368
+ validity_years: 3,
369
+ custom_expiration_date: "2017-05-18",
370
+ comments: "Comments for the the approver",
371
+ disable_renewal_notifications: false,
372
+ renewal_of_order_id: 314152,
373
+ )
374
+ ```
375
+
376
+ #### Order SSL EV Plus Certificate
377
+
378
+ Use this interface to order a SSL EV Plus Certificate.
379
+
380
+ ```ruby
381
+ Digicert::SSLCertificate::SSLEVPlus.create(
382
+ certificate: {
383
+ common_name: "digicert.com",
384
+ csr: "------ [CSR HERE] ------",
385
+ signature_hash: "sha256",
386
+
387
+ organization_units: ["Developer Operations"],
388
+ server_platform: { id: 45 },
389
+ profile_option: "some_ssl_profile",
390
+ },
391
+
392
+ organization: { id: 117483 },
393
+ validity_years: 3,
394
+ custom_expiration_date: "2017-05-18",
395
+ comments: "Comments for the the approver",
396
+ disable_renewal_notifications: false,
397
+ renewal_of_order_id: 314152,
398
+ )
399
+ ```
400
+
401
+ #### Order Client Premium Certificate
402
+
403
+ Use this interface to order a Client Premium Certificate.
404
+
405
+ ```ruby
406
+ Digicert::ClientCertificate::Premium.create(
407
+ certificate: {
408
+ common_name: "Full Name",
409
+ emails: ["email@example.com", "email1@example.com"],
410
+ csr: "------ [CSR HERE] ------",
411
+ signature_hash: "sha256",
412
+
413
+ organization_units: ["Developer Operations"],
414
+ server_platform: { id: 45 },
415
+ profile_option: "some_ssl_profile",
416
+ },
417
+
418
+ organization: { id: 117483 },
419
+ validity_years: 3,
420
+ custom_expiration_date: "2017-05-18",
421
+ comments: "Comments for the the approver",
422
+ disable_renewal_notifications: false,
423
+ renewal_of_order_id: 314152,
424
+ )
425
+ ```
426
+
427
+ #### Order Email Security Plus
428
+
429
+ Use this interface to order a Email Security Plus Certificate
430
+
431
+ ```ruby
432
+ Digicert::ClientCertificate::EmailSecurityPlus.create(
433
+ certificate: {
434
+ common_name: "Full Name",
435
+ emails: ["email@example.com", "email1@example.com"],
436
+ signature_hash: "sha256",
437
+
438
+ organization_units: ["Developer Operations"],
439
+ server_platform: { id: 45 },
440
+ profile_option: "some_ssl_profile",
441
+ },
442
+
443
+ organization: { id: 117483 },
444
+ validity_years: 3,
445
+ auto_renew: 10,
446
+ renewal_of_order_id: 314152,
447
+ )
448
+ ```
449
+
450
+ #### Order Client Digital Signature Plus
451
+
452
+ Use this interface to order a Client Digital Signature Plus
453
+
454
+ ```ruby
455
+ Digicert::Order::DigitalSignaturePlus.create(
456
+ certificate: {
457
+ common_name: "Full Name",
458
+ emails: ["email@example.com", "email1@example.com"],
459
+ csr: "-----BEGIN CERTIFICATE REQUEST----- ...",
460
+ signature_hash: "sha256",
461
+ },
462
+
463
+ organization: { id: 117483 },
464
+ validity_years: 3,
465
+ auto_renew: 10,
466
+ renewal_of_order_id: 314152,
467
+ )
468
+ ```
469
+
470
+ ### Request Management
471
+
472
+ #### List certificate requests
473
+
474
+ Use this interface to retrieve a list of certificate requests.
475
+
476
+ ```ruby
477
+ Digicert::CertificateRequest.all
478
+ ```
479
+
480
+ #### Certificate Request details
481
+
482
+ Use this interface to retrieve the details for a certificate request.
483
+
484
+ ```ruby
485
+ Digicert::CertificateRequest.fetch(request_id)
486
+ ```
487
+
488
+ #### Update Request Status
489
+
490
+ Use this interface to update the status of a previously submitted certificate
491
+ request.
492
+
493
+ ```ruby
494
+ Digicert::CertificateRequest.update(
495
+ request_id, status: "approved", processor_comment: "Your domain is approved",
496
+ )
497
+ ```
498
+
499
+ ### Order Management
500
+
501
+ #### View a Certificate Order
502
+
503
+ Use this interface to retrieve a certificate order and the response includes all
504
+ the order attributes along with a `certificate` in it.
505
+
506
+ ```ruby
507
+ Digicert::Order.fetch(order_id)
508
+ ```
509
+
510
+ #### List Certificate Orders
511
+
512
+ Use this interface to retrieve a list of all certificate orders.
513
+
514
+ ```ruby
515
+ Digicert::Order.all
516
+ ```
517
+
518
+ #### List of Email Validations
519
+
520
+ Use this interface to view the status of all emails that require validation on a
521
+ client certificate order.
522
+
523
+ ```ruby
524
+ Digicert::EmailValidation.all(order_id: order_id)
525
+
526
+ # If you prefer then there is an alternative alias method
527
+ # on the order class, you can invoke that on any of its
528
+ # instances. Usages
529
+ #
530
+ order = Digicert::Order.find(order_id)
531
+ order.email_validations
532
+ ```
533
+
534
+ #### Validate an Email Address
535
+
536
+ Use this interface to verify control of an email address, using an email
537
+ address/token pair.
538
+
539
+ ```ruby
540
+ Digicert::EmailValidation.valid?(token: token, email: email)
541
+ # => true or false
542
+ ```
543
+
544
+ #### Reissue a Certificate Order
545
+
546
+ Use this interface to reissue a certificate order. A reissue replaces the
547
+ existing certificate with a new one that has different information such as
548
+ common name, CSR, etc. The simplest interface to reissue an update an existing
549
+ order is
550
+
551
+ ```ruby
552
+ order = Digicert::Order.find(order_id)
553
+ order.reissue
554
+
555
+ # Alternative and prefereed in most case
556
+ Digicert::OrderReissuer.create(order_id: order_id)
557
+ ```
558
+
559
+ And if there are some updated information like `csr`, `common_name` or etc then
560
+ you can use the same interface but pass the `:certificate` option. Please
561
+ remember if any required fields are missing then it will use the data that
562
+ already exists for that order.
563
+
564
+ ```ruby
565
+ Digicert::OrderReissuer.create(
566
+ order: order_id,
567
+ certificate: {
568
+ common_name: certificate_common_name,
569
+ dns_names: [certificate_dns_name],
570
+ csr: certificate_csr,
571
+ signature_hash: certificate_signature_hash,
572
+ server_platform: { id: certificate_server_platform_id },
573
+ }
574
+ )
575
+ ```
576
+
577
+ #### Duplicate a Certificate Order
578
+
579
+ Use this interface to request a duplicate certificate for an order. A duplicate
580
+ shares the expiration date as the existing certificate and is identical with the
581
+ exception of the CSR and a possible change in the server platform and signature
582
+ hash. The common name and sans need to be the same as the original order.
583
+
584
+ ```ruby
585
+ Digicert::OrderDuplicator.create(
586
+ order: order_id,
587
+ certificate: {
588
+ common_name: certificate_common_name,
589
+ dns_names: [certificate_dns_name],
590
+ csr: certificate_csr,
591
+ signature_hash: certificate_signature_hash,
592
+ server_platform: { id: certificate_server_platform_id },
593
+ }
594
+ )
595
+ ```
596
+
597
+ #### Find a Duplicate Certificate
598
+
599
+ As of now, the Digicert API, does not have an easier way to find a duplicate
600
+ certificate, as the certificate duplication returns existing `order_id` with a
601
+ `request` node which only has an `id`.
602
+
603
+ So to find out a duplicate certificate, we need to retrieve the details for that
604
+ specific request and from that response retrieve the `date_created` for the
605
+ duplicate certificate and then use that `date_created` to find out the correct
606
+ certificate from the duplications of that specific order.
607
+
608
+ This requires lots of work, so this following interface will do all of its
609
+ underlying tasks, and all we need to do is pass the requests id that we will
610
+ have form the certificate duplication.
611
+
612
+ ```ruby
613
+ # Duplicate an existing certificate order
614
+ #
615
+ order = Digicert::Order.find(order_id)
616
+ duplicate_order = order.duplicate
617
+
618
+ # Use the request id to find out the certificate
619
+ #
620
+ request_id = duplicate_order.requests.first.id
621
+ Digicert::DuplicateCertificateFinder.find_by(request_id: request_id)
622
+ ```
623
+
624
+ #### List Duplicate Certificates
625
+
626
+ Use this interface to view all duplicate certificates for an order.
627
+
628
+ ```ruby
629
+ Digicert::DuplicateCertificate.all(order_id: order_id)
630
+
631
+ # Alternative interface for duplicate certificates
632
+ order = Digicert::Order.find(order_id)
633
+ order.duplicate_certificates
634
+ ```
635
+
636
+ #### Cancel a Certificate Order
637
+
638
+ Use this interface to update the status of an order. Currently this endpoint only
639
+ allows updating the status to 'CANCELED'
640
+
641
+ ```ruby
642
+ order = Digicert::Order.find(order_id)
643
+ order.cancel(note: "Cancellation note")
644
+
645
+ # Or use the actual interface for more control
646
+ Digicert::OrderCancellation.create(
647
+ order_id: order_id, status: "CANCELED", note: "your_note", send_emails: true,
648
+ )
649
+ ```
650
+
651
+ ### Reports
652
+
653
+ #### Expiring Orders
654
+
655
+ Use this interface to retrieve the number of orders that have certificates
656
+ expiring within 90, 60, and 30 days. The number of orders that have already
657
+ expired certificates within the last 7 days is also returned.
658
+
659
+ ```ruby
660
+ Digicert::ExpiringOrder.all(container_id: container_id)
661
+ ```
662
+
663
+ ### Certificate Management
664
+
665
+ #### Download a Certificate
666
+
667
+ This request will return an SSL Certificate file from an order. By default, it
668
+ uses the platform specified by the order.
669
+
670
+ ```ruby
671
+ # Fetch the certficate details that includes a http status code
672
+ # and the file content in the `#body`, so you can choose if you
673
+ # want to write it to your filesystem or directly upload it to
674
+ # your host, and the contents it returns is `zip` archieve.
675
+ #
676
+ certificate = Digicert::CertificateDownloader.fetch(certificate_id, **attributes)
677
+
678
+ # write to content to somewhere in your filesystem.
679
+ #
680
+ File.write("path_to_file_system/certificate.zip", certificate.body)
681
+
682
+ # Alaternative to fetch it through certificate instance
683
+ #
684
+ certificate = Digicert::Certificate.find(certificate_id)
685
+ certificate_content_object = certificate.download
686
+ ```
687
+
688
+ Additionally, if you want the gem to handle the file writing then it also
689
+ provides another helper interface `fetch_to_path`, and that will fetch the file
690
+ content and write the content to supplied path.
691
+
692
+ ```ruby
693
+ Digicert::CertificateDownloader.fetch_to_path(
694
+ certificate_id,
695
+ ext: "zip",
696
+ path: File.expand_path("./file/download/path"),
697
+ **other_attributes_hash_like_platform_or_format,
698
+ )
699
+
700
+ # Alternative through a certificate instance
701
+ #
702
+ certificate = Digicert::Certificate.find(certificate_id)
703
+ certificate.download_to_path(path: "file/path", ext: "zip", format: "zip")
704
+ ```
705
+
706
+ #### Download a Certificate By Format
707
+
708
+ This interface will return an SSL Certificate file from an order. The certificate
709
+ will be return in the format you specify, but one thing to remember the
710
+ certificate will be archived as `zip` along with the instructions, so you need
711
+ to write that as zip archive.
712
+
713
+ ```ruby
714
+ Digicert::CertificateDownloader.fetch_by_format(
715
+ certificate_id, format: format,
716
+ )
717
+
718
+ # Alternative using the certificate instance
719
+ #
720
+ certificate = Digicert::Certificate.find(certificate_id)
721
+ certificate_content_object = certificate.download(format: format)
722
+ ```
723
+
724
+ #### Download a Certificate By Platform
725
+
726
+ This interface will return an SSL Certificate file from an order using the
727
+ platform specified.
728
+
729
+ ```ruby
730
+ certificate = Digicert::CertificateDownloader.fetch_by_platform(
731
+ certificate_id, platform: "apache",
732
+ )
733
+
734
+ # Alternative using the certificate instance
735
+ #
736
+ certificate = Digicert::Certificate.find(certificate_id)
737
+ certificate_content_object = certificate.download(platform: "apache")
738
+ ```
739
+
740
+ #### Download a Certificate content
741
+
742
+ This interface will fetch a SSL Certificate and extract all of its subsidiary
743
+ certificates content and return as a hash with `certificate`, `root_certificate`
744
+ and `intermediate_certificate` keys.
745
+
746
+ ```ruby
747
+ Digicert::CertificateDownloader.fetch_content(certificate_id)
748
+
749
+ # Alternative using certificate instance
750
+ #
751
+ certificate = Digicert::Certificate.find(certificate_id)
752
+ certificate.download_content
753
+ ```
754
+
755
+ #### Revoke a Certificate
756
+
757
+ This interface will revoke a previously issued SSL Certificate.
758
+
759
+ ```ruby
760
+ Digicert::Certificate.revoke(certificate_id, comments: "Your comment")
761
+ ```
26
762
 
27
763
  ## Development
28
764
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
765
+ We are following Sandi Metz's Rules for this gem, you can read the
766
+ [description of the rules here][sandi-metz] All new code should follow these
767
+ rules. If you make changes in a pre-existing file that violates these rules you
768
+ should fix the violations as part of your contribution.
769
+
770
+ ### Setup
771
+
772
+ Clone the repository.
773
+
774
+ ```sh
775
+ git clone https://github.com/riboseinc/digicert
776
+ ```
30
777
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
778
+ Setup your environment.
779
+
780
+ ```sh
781
+ bin/setup
782
+ ```
783
+
784
+ Run the test suite
785
+
786
+ ```sh
787
+ bin/rspec
788
+ ```
789
+
790
+ ### Play Box
791
+
792
+ The API Play Box provides an interactive console so we can easily test out the
793
+ actual API interaction. But before moving forward let's configure the your key.
794
+
795
+ Setup the client configuration.
796
+
797
+ ```sh
798
+ cp .sample.pryrc .pryrc
799
+ vim .pryrc
800
+ ```
801
+
802
+ Start the console.
803
+
804
+ ```sh
805
+ bin/console
806
+ ```
807
+
808
+ Start playing with it.
809
+
810
+ ```ruby
811
+ Digicert::Product.all
812
+ ```
32
813
 
33
814
  ## Contributing
34
815
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/Ronald Tse/digicert. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
816
+ First, thank you for contributing! We love pull requests from everyone. By
817
+ participating in this project, you hereby grant [Ribose Inc.][riboseinc] the
818
+ right to grant or transfer an unlimited number of non exclusive licenses or
819
+ sub-licenses to third parties, under the copyright covering the contribution
820
+ to use the contribution by all means.
821
+
822
+ Here are a few technical guidelines to follow:
823
+
824
+ 1. Open an [issue][issues] to discuss a new feature.
825
+ 1. Write tests to support your new feature.
826
+ 1. Make sure the entire test suite passes locally and on CI.
827
+ 1. Open a Pull Request.
828
+ 1. [Squash your commits][squash] after receiving feedback.
829
+ 1. Party!
830
+
831
+
832
+ ## Credits
833
+
834
+ This gem is developed, maintained and funded by [Ribose Inc.][riboseinc]
36
835
 
836
+ [riboseinc]: https://www.ribose.com
837
+ [issues]: https://github.com/riboseinc/digicert/issues
838
+ [squash]: https://github.com/thoughtbot/guides/tree/master/protocol/git#write-a-feature
839
+ [sandi-metz]: http://robots.thoughtbot.com/post/50655960596/sandi-metz-rules-for-developers