digicert-cli 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.hound.yml +3 -0
  3. data/.rubocop.yml +637 -0
  4. data/.travis.yml +0 -1
  5. data/Gemfile +0 -2
  6. data/LICENSE.txt +21 -0
  7. data/README.md +218 -21
  8. data/bin/digicert +1 -2
  9. data/digicert-cli.gemspec +3 -12
  10. data/lib/digicert/cli.rb +33 -9
  11. data/lib/digicert/cli/auth.rb +6 -3
  12. data/lib/digicert/cli/base.rb +19 -0
  13. data/lib/digicert/cli/certificate.rb +75 -0
  14. data/lib/digicert/cli/certificate_downloader.rb +51 -0
  15. data/lib/digicert/cli/command.rb +14 -48
  16. data/lib/digicert/cli/commands/certificate.rb +37 -0
  17. data/lib/digicert/cli/commands/csr.rb +31 -0
  18. data/lib/digicert/cli/commands/order.rb +45 -0
  19. data/lib/digicert/cli/csr.rb +48 -0
  20. data/lib/digicert/cli/filter_builder.rb +54 -0
  21. data/lib/digicert/cli/order.rb +9 -23
  22. data/lib/digicert/cli/order_reissuer.rb +60 -11
  23. data/lib/digicert/cli/order_retriever.rb +48 -0
  24. data/lib/digicert/cli/rcfile.rb +48 -0
  25. data/lib/digicert/cli/util.rb +5 -1
  26. data/lib/digicert/cli/version.rb +23 -1
  27. data/spec/acceptance/certificate_spec.rb +66 -0
  28. data/spec/acceptance/config_spec.rb +16 -0
  29. data/spec/acceptance/csr_spec.rb +51 -0
  30. data/spec/acceptance/order_spec.rb +6 -21
  31. data/spec/acceptance/reissuing_order_spec.rb +33 -0
  32. data/spec/digicert/cli/certificate_downloader_spec.rb +30 -0
  33. data/spec/digicert/cli/certificate_spec.rb +104 -0
  34. data/spec/digicert/cli/csr_spec.rb +47 -0
  35. data/spec/digicert/cli/filter_builder_spec.rb +25 -0
  36. data/spec/digicert/cli/order_reissuer_spec.rb +74 -0
  37. data/spec/digicert/cli/order_retriever_spec.rb +23 -0
  38. data/spec/digicert/{order_spec.rb → cli/order_spec.rb} +2 -2
  39. data/spec/digicert/cli/rcfile_spec.rb +18 -0
  40. data/spec/digicert/cli_spec.rb +6 -5
  41. data/spec/fixtures/.digicertrc +2 -0
  42. data/spec/fixtures/rsa4096.csr +51 -0
  43. data/spec/fixtures/rsa4096.key +51 -0
  44. data/spec/spec_helper.rb +8 -1
  45. data/spec/support/disable-logging.rb +12 -0
  46. metadata +70 -22
  47. data/.sample.env +0 -1
  48. data/bin/console +0 -14
  49. data/legacy_cli.sh +0 -301
  50. data/lib/digicert/cli/command/order.rb +0 -50
  51. data/lib/digicert/cli/order_filterer.rb +0 -43
  52. data/spec/digicert/command_spec.rb +0 -16
  53. data/spec/digicert/order_filterer_spec.rb +0 -50
  54. data/spec/digicert/order_reissuer_spec.rb +0 -19
data/.travis.yml CHANGED
@@ -4,5 +4,4 @@ rvm:
4
4
  - 2.4.1
5
5
 
6
6
  before_install:
7
- - cp .sample.env .env
8
7
  - gem install bundler -v 1.14.6
data/Gemfile CHANGED
@@ -2,5 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in digicert-cli.gemspec
4
4
  gemspec
5
-
6
- gem "digicert", github: "riboseinc/digicert", ref: "f122a4b"
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
@@ -2,51 +2,245 @@
2
2
 
3
3
  [![Build
4
4
  Status](https://travis-ci.org/riboseinc/digicert-cli.svg?branch=master)](https://travis-ci.org/riboseinc/digicert-cli)
5
+ [![Code
6
+ Climate](https://codeclimate.com/github/riboseinc/digicert-cli/badges/gpa.svg)](https://codeclimate.com/github/riboseinc/digicert-cli)
7
+ [![Gem
8
+ Version](https://badge.fury.io/rb/digicert-cli.svg)](https://badge.fury.io/rb/digicert-cli)
5
9
 
6
- The CLI for the Digicert API
10
+ The [Digicert CLI] is a tool that allows us to manage Digicert orders,
11
+ certificates and etc using [Digicert Ruby Client].
12
+
13
+ ## Configure
14
+
15
+ We need to setup our API key before we want to use the CLI. For simplicity we
16
+ have add an easier interface to setup the Digicert API KEY. To setup your key
17
+ please use the following interface.
18
+
19
+ ```sh
20
+ digicert config DIGICERT_API_KEY
21
+ ```
7
22
 
8
23
  ## Usages
9
24
 
25
+ ### Getting Help
26
+
27
+ We have been trying to simplify the `CLI` with proper `help` documentation. Each
28
+ of the `command` and `subcommand` should provide you the basic usages guide with
29
+ the list of supported options.
30
+
31
+ Normally the parent command should fire up the `help` documentation, but if it
32
+ does not then you can explicitly call the `help` command or pass `-h` flags with
33
+ any of the action and that should fire up the documentation. For example
34
+
35
+ ```sh
36
+ $ digicert help
37
+ ```
38
+
39
+ ```sh
40
+ Commands:
41
+ digicert certificate # Manage Digicert Certificates
42
+ digicert config API_KEY # Configure The CLI Client
43
+ digicert csr # Fetch/generate Certificate CSR
44
+ digicert help [COMMAND] # Describe available / One specific command
45
+ digicert order # Manage Digicert Orders
46
+ ```
47
+
48
+ The above command lists the available commands with a basic description and as
49
+ you might have notice, it also ships with a `help` command which can be used to
50
+ up the usages documentation for it's nested command.
51
+
52
+ ```sh
53
+ # digicert order -h
54
+ $ digicert help order
55
+ ```
56
+
57
+ ```sh
58
+ Commands:
59
+ digicert order find # Find a digicert order
60
+ digicert order help [COMMAND] # Describe subcommands or one specific
61
+ digicert order list # List digicert orders
62
+ digicert order reissue ORDER_ID # Reissue digicert order
63
+ ```
64
+
65
+ Hopefully you get the idea, we will try our best to keep this guide up to date
66
+ but whenever you need some more information please add the `-h` flags with any
67
+ commands or subcommands and you should see what you need.
68
+
10
69
  ### Orders
11
70
 
12
- This CLI provides an easier interface to list the orders from the Digicert API.
13
- To retrieve the list of the certificate orders we can use
71
+ #### Listing Orders
72
+
73
+ Listing orders is pretty simple with the CLI, once we have our API key
74
+ configured then we can list all of our orders using the `list` interface
75
+
76
+ ```sh
77
+ $ digicert order list
78
+ ```
14
79
 
15
80
  ```sh
16
- digicert order list
81
+ +---------------+---------------+------------------+-------------+-------------+
82
+ | Id | Product Type | Common Name | Status | Expiry |
83
+ +---------------+---------------+------------------+-------------+-------------+
84
+ | xxxxx65 | ssl_wildcard | *.ribosetest.com | expired | 2018-06-25 |
85
+ | xxxxx20 | ssl_wildcard | *.ribosetest.com | issued | 2018-06-15 |
86
+ | xxxxx06 | ssl_wildcard | *.ribosetest.com | revoked | 2018-05-09 |
87
+ +---------------+---------------+------------------+-------------+-------------+
17
88
  ```
18
89
 
19
- Digicert does not have any a direct interface to filter certificate orders,
20
- but we have added partial support for filtering, to filter the orders by any
21
- specific criteria please pass those as option to the `order list` interface.
22
- Currently supported options are `common_name` and `product_type`.
90
+ The above interface without any option will list out all of the orders we have
91
+ with Digicert, but sometime we might need to filter those listings, and that's
92
+ where can can use the filter options. This interface supports filter options
93
+ through the `--filter` option and expect the value to be in `key:value` format.
94
+
95
+ For example, if we want to retrieve all of the orders that has product type of
96
+ `ssl_wildcard` then we can use
23
97
 
24
98
  ```sh
25
- digicert order list -c "ribosetest.com" -p "ssl_plus"
99
+ $ digicert order list --filter 'product_name_id:ssl_wildcard'
26
100
  ```
27
101
 
28
- ### Single Order
102
+ It will only list the orders with the `ssl_wildcard` product type, Currently the
103
+ supported filters options are `date_created`, `valid_till`, `status`, `search`,
104
+ `common_name` and `product_name_id`. Please [check the wiki] for more up to date
105
+ supported filtering options.
106
+
107
+ #### Find an order
108
+
109
+ We can use the `find` interface to retrieve a single order, by default it will
110
+ print the details in the console. This interface also supports filter options.
111
+
112
+ One important thing to remember, it will only retrieve one single entry, so if
113
+ you have multiple orders in your specified terms then it will only retrieve the
114
+ most recent one form that list.
29
115
 
30
- Use `find` interface to retrieve a single order, this interface supports all
31
- default filters.
116
+ ```sh
117
+ $ digicert order find --filter 'common_name:ribosetest.com' 'product_name_id:ssl_plus'
118
+ ```
32
119
 
33
120
  ```sh
34
- digicert order find -c "ribosetest.com" -p "ssl_plus" --status expired
121
+ #<Digicert::ResponseObject id=xxx04, certificate=#<Digicert::ResponseObject
122
+ ..........................id=xxxx08 price=xxxx, product_name_id="ssl_plus">
35
123
  ```
36
124
 
37
- This interface also allow us to specific a flag in case we only want to find
38
- the `id` for the resource.
125
+ But if you don't care about that much of data and only need the `ID` then you
126
+ can pass the `--quiet` flags to reduce the noises and retrieve only the id.
127
+
128
+ #### Reissue an order
129
+
130
+ To reissue a non-expired order we can use the `reissue` interface and pass the
131
+ order id to it. By default it will reissue the order using the existing details
132
+ but if we want to update the `CSR` then we can pass the certificate file as
133
+ `--crt`.
134
+
135
+ ```sh
136
+ $ digicert order reissue 12345 --crt path_to_the_new_csr.csr
137
+ ```
39
138
 
40
139
  ```sh
41
- digicert order find -c "ribosetest.com" -p "ssl_plus" --status expired --quiet
140
+ Reissue request xxxxx8 created for order - 123456
42
141
  ```
43
142
 
44
- ### Reissue an order
143
+ Pretty cool right? The above interface also support some other option that we
144
+ can use to download the recently reissued order. To download, all we need to do
145
+ is just provide a valid path and it will automatically download the certificates
146
+
147
+ ```sh
148
+ $ digicert order reissue 123456 --output /path/to/downloads
149
+ ```
150
+
151
+ ```sh
152
+ Reissue request 1xxxxx created for order - 123456
153
+
154
+ Fetch attempt 1..
155
+ Downloaded certificate to:
156
+
157
+ /path/to/downloads/123456.root.crt
158
+ /path/to/downloads/123456.certificate.crt
159
+ /path/to/downloads/123456.intermediate.crt
160
+ ```
161
+
162
+ ### Certificate
163
+
164
+ #### Fetch a certificate
165
+
166
+ The `fetch` interface will retrieve the certificate for any specific orders, by
167
+ default it will print out the detail in the console but if we only want the `ID`
168
+ then we can pass the `--quiet` flags with it.
169
+
170
+ ```sh
171
+ $ digicert certificate fetch 123456789 --quiet
172
+ ```
173
+
174
+ #### Download a certificate
175
+
176
+ To download a certificate we can use the same `fetch` interface but with the
177
+ `--output` option. Based on the `--output` option `fetch` interface will fetch
178
+ the certificates and download the `root`, `intermediate` and `certificate` to
179
+ the output path, to download a certificate we can do
180
+
181
+ ```sh
182
+ $ digicert certificate fetch 123456 --output /path/to/downloads
183
+ ```
184
+
185
+ The above interface supports downloading a certificate and it expects us to
186
+ provide the `order-id`, but if we only care about download then we can also use
187
+ the `download` interface. It acts pretty much similar but it let's us specify
188
+ the `order-id` or `certificate-id`.
189
+
190
+ ```sh
191
+ $ digicert certificate download --order-id 654321 --output /downloads
192
+ $ digicert certificate download --certificate-id 123456 --output /downloads
193
+ ```
194
+
195
+ #### List duplicate certificates
196
+
197
+ Digicert allows us to duplicate a certificate and if we want to list all of the
198
+ duplicates then we can use the `duplicates` interface. This interface expects us
199
+ to provide the `order-id` to list the duplicates
200
+
201
+ ```sh
202
+ $ digicert certificate duplicates 123456
203
+ ```
204
+
205
+ ```sh
206
+ +----------+-------------------+------------------+----------+--------------+
207
+ | Id | Common Name | SAN Names | Status | Validity |
208
+ +----------+-------------------+------------------+----------+--------------+
209
+ | xxxxx19 | *.ribosetest.com | *.ribosetest.com | approved | xxxxx-xxxxxx |
210
+ | | | ribosetest.com | | |
211
+ +----------+-------------------+------------------+----------+--------------+
212
+ ```
213
+
214
+ ### CSR
215
+
216
+ #### Fetch an order's CSR
217
+
218
+ Retrieving a `CSR` is pretty easy, if we have an order id and we want retrieve
219
+ it's `CSR` then we can use the `fetch` interface from `csr` command. And once we
220
+ passed it to the interface then it will retrieve and print it to the console.
221
+
222
+ ```sh
223
+ $ digicert csr fetch 123456
224
+ ```
225
+
226
+ #### Generate a new CSR
227
+
228
+ Digicert gem usages a third party library to generate a CSR, and we have also
229
+ included that in the CLI to make the `CSR` generation process simpler, so if we
230
+ need to generate a new `CSR` then we can use the `generate` interface and pass
231
+ the order id with the key file to generate the CSR
232
+
233
+ ```sh
234
+ $ digicert csr generate --oreder-id 12345 --key /path/to/the/key-file.key
235
+ ```
45
236
 
46
- To reissue an existing order, we can use the following interface.
237
+ This interface also support custom details like `common-name` and `san`. We can
238
+ pass those as `--common-name` and `--san` and it will automatically use it to
239
+ generate the new `CSR`
47
240
 
48
241
  ```sh
49
- digicert order reissue --order_id 12345
242
+ $ digicert csr generate --common-name ribosetest.com --order-id 1234 \
243
+ --san test1.ribosetest.com test2.ribosetest.com --key path_to_key_file
50
244
  ```
51
245
 
52
246
  ## Development
@@ -61,7 +255,7 @@ should fix the violations as part of your contribution.
61
255
  Clone the repository.
62
256
 
63
257
  ```sh
64
- git clone https://github.com/abunashir/digicert-cli
258
+ git clone https://github.com/riboseinc/digicert-cli
65
259
  ```
66
260
 
67
261
  Setup your environment.
@@ -99,6 +293,9 @@ Here are a few technical guidelines to follow:
99
293
  This gem is developed, maintained and funded by [Ribose Inc.][riboseinc]
100
294
 
101
295
  [riboseinc]: https://www.ribose.com
102
- [issues]: https://github.com/abunashir/digicert-cli/issues
296
+ [issues]: https://github.com/riboseinc/digicert-cli/issues
103
297
  [squash]: https://github.com/thoughtbot/guides/tree/master/protocol/git#write-a-feature
104
298
  [sandi-metz]: http://robots.thoughtbot.com/post/50655960596/sandi-metz-rules-for-developers
299
+ [Digicert CLI]: https://github.com/riboseinc/digicert-cli
300
+ [Digicert Ruby Client]: https://github.com/riboseinc/digicert
301
+ [check the wiki]: https://github.com/riboseinc/digicert-cli/wiki
data/bin/digicert CHANGED
@@ -16,7 +16,6 @@ class Gem::Specification
16
16
  end
17
17
 
18
18
  # start up the CLI
19
- require "bundler/setup"
20
19
  require "digicert/cli"
21
20
 
22
- Digicert::CLI.start(*ARGV)
21
+ Digicert::CLI.start(ARGV)
data/digicert-cli.gemspec CHANGED
@@ -20,21 +20,12 @@ Gem::Specification.new do |spec|
20
20
  spec.bindir = "bin"
21
21
  spec.executables = "digicert"
22
22
 
23
- # Digicert gem dpendenceis
24
- #
25
- # We are developing this cli and the digicert gem at the same time
26
- # and we might not instantly push the digicert gems to rubygems while
27
- # we are adding any new features. So let's use the one from our github
28
- # and once we are close to finalize then we will switch to the actual
29
- # digicert gem from rubygems.
30
- #
31
- # spec.add_dependency "digicert", "~> 0.1.1"
32
- #
33
-
23
+ spec.add_dependency "thor", "~> 0.19.4"
24
+ spec.add_dependency "digicert", "~> 0.1.2"
25
+ spec.add_dependency "openssl", ">= 2.0.3"
34
26
  spec.add_dependency "terminal-table"
35
27
 
36
28
  spec.add_development_dependency "bundler", "~> 1.14"
37
- spec.add_development_dependency "dotenv"
38
29
  spec.add_development_dependency "rake", "~> 10.0"
39
30
  spec.add_development_dependency "rspec", "~> 3.0"
40
31
  spec.add_development_dependency "webmock", "~> 2.0"
data/lib/digicert/cli.rb CHANGED
@@ -1,20 +1,44 @@
1
- require "optparse"
1
+ #--
2
+ # Copyright (c) 2017 Ribose Inc.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ # ++
22
+
23
+ require "thor"
24
+ require "openssl"
2
25
  require "digicert"
3
26
 
4
27
  require "digicert/cli/util"
5
28
  require "digicert/cli/auth"
29
+ require "digicert/cli/base"
6
30
  require "digicert/cli/command"
7
31
 
8
32
  module Digicert
9
33
  module CLI
10
- def self.start(*args)
11
- command = args.shift.strip rescue help
12
- subcommand = args.first.start_with?("-") ? "list" : args.shift.strip
13
-
14
- response = Digicert::CLI::Command.run(command, subcommand, args)
15
-
16
- $stdout.write(response)
17
- $stdout.write("\n")
34
+ def self.start(arguments)
35
+ Digicert::CLI::Command.start(arguments)
36
+ rescue Digicert::Errors::Forbidden, NoMethodError
37
+ Thor::Shell::Basic.new.say(
38
+ "Invalid: Missing API KEY\n\n" \
39
+ "A valid Digicert API key is required for any of the CLI operation\n" \
40
+ "You can set your API Key using `digicert config DIGICERT_API_KEY`",
41
+ )
18
42
  end
19
43
  end
20
44
  end
@@ -1,5 +1,8 @@
1
- require "dotenv/load"
1
+ require "digicert"
2
+ require "digicert/cli/rcfile"
2
3
 
3
- Digicert.configure do |config|
4
- config.api_key = ENV["DIGICERT_API_KEY"]
4
+ unless Digicert.configuration.api_key
5
+ Digicert.configure do |config|
6
+ config.api_key = Digicert::CLI::RCFile.api_key || ENV["DIGICERT_API_KEY"]
7
+ end
5
8
  end
@@ -0,0 +1,19 @@
1
+ module Digicert
2
+ module CLI
3
+ class Base
4
+ attr_reader :order_id, :options
5
+
6
+ def initialize(attributes = {})
7
+ @options = attributes
8
+ @order_id = options.delete(:order_id)
9
+
10
+ extract_local_attributes(options)
11
+ end
12
+
13
+ private
14
+
15
+ def extract_local_attributes(options)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,75 @@
1
+ module Digicert
2
+ module CLI
3
+ class Certificate < Digicert::CLI::Base
4
+ def fetch
5
+ apply_option_flags(order.certificate)
6
+ end
7
+
8
+ def duplicates
9
+ if order_id && duplicate_certificates
10
+ display_in_table(duplicate_certificates)
11
+ end
12
+ end
13
+
14
+ def download
15
+ download_certificate(certificate_id)
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :output_path
21
+
22
+ def extract_local_attributes(options)
23
+ @output_path = options.fetch(:output, nil)
24
+ end
25
+
26
+ def order
27
+ @order ||= Digicert::Order.fetch(order_id)
28
+ end
29
+
30
+ def certificate_id
31
+ @certificate_id ||= options[:certificate_id] || order.certificate.id
32
+ end
33
+
34
+ def duplicate_certificates
35
+ @certificates ||= Digicert::DuplicateCertificate.all(order_id: order_id)
36
+ end
37
+
38
+ def apply_option_flags(certificate)
39
+ download_certificate(certificate.id) || apply_output_flag(certificate)
40
+ end
41
+
42
+ def download_certificate(certificate_id)
43
+ if output_path
44
+ Digicert::CLI::CertificateDownloader.download(
45
+ path: output_path,
46
+ certificate_id: certificate_id,
47
+ filename: order_id || certificate_id,
48
+ )
49
+ end
50
+ end
51
+
52
+ def apply_output_flag(certificate)
53
+ options[:quiet] ? certificate.id : certificate
54
+ end
55
+
56
+ def display_in_table(certificates)
57
+ certificates_attributes = certificates.map do |certificate|
58
+ [
59
+ certificate.id,
60
+ certificate.common_name,
61
+ certificate.dns_names.join("\n"),
62
+ certificate.status,
63
+ [certificate.valid_from, certificate.valid_till].join(" - "),
64
+ ]
65
+ end
66
+
67
+ Digicert::CLI::Util.make_it_pretty(
68
+ table_wdith: 100,
69
+ rows: certificates_attributes,
70
+ headings: ["Id", "Common Name", "SAN Names", "Status", "Validity"],
71
+ )
72
+ end
73
+ end
74
+ end
75
+ end