diff --git a/README.md b/README.md index 355fb24..f782d1d 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ lab-ca list --revoked Issue a new certificate from the command line: ```bash -lab-ca issue --name [--subject ] [--type ] [--validity ] [--san ...] [--overwrite] [--dry-run] [--verbose] +lab-ca issue --name [--subject ] [--type ] [--validity ] [--san ...] [--dry-run] [--verbose] ``` - `--name` (required): Name for the certificate and key files (used as subject if `--subject` is omitted) @@ -94,7 +94,6 @@ lab-ca issue --name [--subject ] [--type ] [--validity [--subject ] [--type ] [--validity [--overwrite] [--verbose] +lab-ca provision --file [--verbose] ``` #### Example HCL Provisioning File @@ -223,13 +222,9 @@ See `examples/example-certificates.hcl` for a more advanced provisioning file wi ## Building the Tool -The repository includes a `build.sh` script to build the CLI tool. It updates the version in `version.go` and builds the binary. +The repository includes a `Makefile` to build the CLI tool. It automatically determines the version from Git tags and builds the binary. -To ignore changes made to `version.go` in Git, you can run: - -```bash -git update-index --assume-unchanged version.go -``` +To build the tool, run the `make` command. The binary will be created as `build/lab-ca`. --- diff --git a/ca.go b/ca.go index 9eb0671..9cfee55 100644 --- a/ca.go +++ b/ca.go @@ -460,9 +460,19 @@ func issueSingleCertificate(def CertificateDefinition, i int, n int) (bool, erro return false, fmt.Errorf("certificate name must be specified and contain only letters, numbers, dash, or underscore") } - // Check if the certificate is in database, fail if it is. + // Check if the certificate is in database, skip if it already exists and is valid. if caState.FindByName(def.Name, false) != nil { - return false, fmt.Errorf("certificate %s already exists and is valid", def.Name) + if !dryRun { + fmt.Printf("skipped (already exists).\n") + } else { + msg := fmt.Sprintf("Certificate '%s' already exists and is valid (would skip).", def.Name) + if n > 1 { + fmt.Printf("[%d/%d] %s\n", i+1, n, msg) + } else { + fmt.Printf("%s\n", msg) + } + } + return false, nil } // Initialize Subject if not specified diff --git a/main.go b/main.go index 9e664e0..9da83c6 100644 --- a/main.go +++ b/main.go @@ -71,10 +71,13 @@ func main() { os.Exit(1) } for _, certDef := range caState.Certificates { - if certDef.RevokedAt != "" { + if certDef.RevokedAt != "" && !listRevoked { continue } fmt.Printf("Certificate %s\n", certDef.Name) + if certDef.RevokedAt != "" { + fmt.Printf("\tStatus: REVOKED (at %s)\n", certDef.RevokedAt) + } fmt.Printf("\tSubject: %s\n\tType: %s\n\tIssued at: %s\n", certDef.Subject, certDef.Type, certDef.Issued) }