Fixes to the documentation. Added missing --revoked logic for the list command.
Some checks failed
Release / release (push) Failing after 53s

This commit is contained in:
2025-12-10 21:33:23 +01:00
parent 714a38d612
commit affa895cfe
3 changed files with 20 additions and 12 deletions

View File

@@ -86,7 +86,7 @@ lab-ca list --revoked
Issue a new certificate from the command line: Issue a new certificate from the command line:
```bash ```bash
lab-ca issue --name <name> [--subject <subject>] [--type <type>] [--validity <period>] [--san <SAN> ...] [--overwrite] [--dry-run] [--verbose] lab-ca issue --name <name> [--subject <subject>] [--type <type>] [--validity <period>] [--san <SAN> ...] [--dry-run] [--verbose]
``` ```
- `--name` (required): Name for the certificate and key files (used as subject if `--subject` is omitted) - `--name` (required): Name for the certificate and key files (used as subject if `--subject` is omitted)
@@ -94,7 +94,6 @@ lab-ca issue --name <name> [--subject <subject>] [--type <type>] [--validity <pe
- `--type`: Certificate type: `client`, `server`, `code-signing`, `email` (comma-separated for multiple usages; default: `server`) - `--type`: Certificate type: `client`, `server`, `code-signing`, `email` (comma-separated for multiple usages; default: `server`)
- `--validity`: Validity period (e.g. `2y`, `6m`, `30d`; default: `1y`) - `--validity`: Validity period (e.g. `2y`, `6m`, `30d`; default: `1y`)
- `--san`: Subject Alternative Name (repeatable; e.g. `dns:example.com`, `ip:1.2.3.4`, `email:user@example.com`) - `--san`: Subject Alternative Name (repeatable; e.g. `dns:example.com`, `ip:1.2.3.4`, `email:user@example.com`)
- `--overwrite`: Allow overwriting existing files
- `--dry-run`: Validate and show what would be created, but do not write files - `--dry-run`: Validate and show what would be created, but do not write files
- `--verbose`: Print detailed information - `--verbose`: Print detailed information
@@ -105,7 +104,7 @@ lab-ca issue --name <name> [--subject <subject>] [--type <type>] [--validity <pe
Provision multiple certificates from a batch file (HCL): Provision multiple certificates from a batch file (HCL):
```bash ```bash
lab-ca provision --file <certificates.hcl> [--overwrite] [--verbose] lab-ca provision --file <certificates.hcl> [--verbose]
``` ```
#### Example HCL Provisioning File #### Example HCL Provisioning File
@@ -223,13 +222,9 @@ See `examples/example-certificates.hcl` for a more advanced provisioning file wi
## Building the Tool ## 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: To build the tool, run the `make` command. The binary will be created as `build/lab-ca`.
```bash
git update-index --assume-unchanged version.go
```
--- ---

14
ca.go
View File

@@ -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") 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 { 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 // Initialize Subject if not specified

View File

@@ -71,10 +71,13 @@ func main() {
os.Exit(1) os.Exit(1)
} }
for _, certDef := range caState.Certificates { for _, certDef := range caState.Certificates {
if certDef.RevokedAt != "" { if certDef.RevokedAt != "" && !listRevoked {
continue continue
} }
fmt.Printf("Certificate %s\n", certDef.Name) 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", fmt.Printf("\tSubject: %s\n\tType: %s\n\tIssued at: %s\n",
certDef.Subject, certDef.Type, certDef.Issued) certDef.Subject, certDef.Type, certDef.Issued)
} }