digicert-cli 0.1.0 → 0.2.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.
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