You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add LICENSE, CONTRIBUTING, CODE_OF_CONDUCT, issue templates, examples/, FAQ section, and pin workflow actions to commit SHAs — open-source hygiene pass to make the repo Show HN-ready: MIT LICENSE file (was just a README badge with no actual file), example workflows pinned to verified SHAs (practising the supply-chain hygiene we preach), and a FAQ pre-empting the 'how is this different from sigstore' / 'why ECDSA-P521 over Ed25519' / 'why hash chain over Merkle log' comments that always come up.
Thanks for taking the time to contribute. This is a small project with a clear scope, so most contributions are welcome — please read this first to keep the loop short.
4
+
5
+
## What we accept
6
+
7
+
- Bug fixes (with a failing test or reproducer)
8
+
- New inputs/outputs on the action that match a real use case
9
+
- README clarifications, FAQ entries, more `examples/` workflows
10
+
- Support for additional SBOM formats already documented in the spec (CycloneDX 1.6, SPDX 2.3, etc.)
11
+
- Improvements to the verify-without-an-account flow
12
+
13
+
## What we don't accept (without discussion first)
14
+
15
+
- New cryptographic primitives. We picked ECDSA-P521 + SHA-512 deliberately and won't swap silently.
16
+
- Mandatory new external services. Optional integrations are fine.
17
+
- Anything that breaks the public no-auth verify endpoint contract.
18
+
- Changes that move signing logic out of the LedgerProve API (the action is intentionally thin).
19
+
20
+
For any of the above, open an issue first to discuss the trade-off before opening a PR.
Copy file name to clipboardExpand all lines: README.md
+50-4Lines changed: 50 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -15,7 +15,7 @@ Cryptographically sign your SBOM, append it to a tamper-evident hash chain, and
15
15
api-key: ${{ secrets.LEDGERPROVE_API_KEY }}
16
16
```
17
17
18
-
That's the whole workflow step. The Action installs Syft, generates a CycloneDX SBOM of your repo, signs it with ECDSA-P521 (private key in AWS KMS), and prints a public verify URL.
18
+
That's the whole workflow step. The Action installs Syft, generates a CycloneDX SBOM of your repo, signs it with ECDSA-P521 (hardware-backed, non-exportable signing key), and prints a public verify URL.
19
19
20
20
## Bring-your-own SBOM (full control)
21
21
@@ -34,7 +34,7 @@ If you already generate an SBOM in a previous step (cyclonedx-cli, custom toolin
34
34
1. Reads your SBOM file (CycloneDX or SPDX, JSON).
35
35
2. Hashes it with SHA-256.
36
36
3. POSTs the hash + metadata to LedgerProve's API.
37
-
4. The API signs your record with **ECDSA-P521** using a private key in **AWS KMS** (the key never leaves AWS).
37
+
4. The API signs your record with **ECDSA-P521** using a private key inside a **hardware-backed KMS** — the key is non-exportable and never leaves the secure enclave.
38
38
5. Your record is appended to a per-org **SHA-512 hash chain** — tampering with any record breaks all subsequent ones.
39
39
6. An **RFC 3161 timestamp** is requested from a public TSA so anyone can prove when the record was signed.
40
40
7. The Action sets `verification-url` as an output for use by later steps (PR comments, release notes, etc.).
@@ -50,7 +50,7 @@ Anyone can verify the signed SBOM at the verification URL with a single OpenSSL
50
50
| `repo-id` | — | `${{ github.repository }}` | Repository identifier under which to record this build. |
51
51
| `commit-hash` | — | `${{ github.sha }}` | The commit SHA to record. |
52
52
| `build-status` | — | `PASS` | `PASS`, `FAIL`, or `WARN`. Use `FAIL` to record a failed build (e.g. tests failed, vulns found). |
53
-
| `cve-count` | — | `0` | Number of CVEs found in this build, if known. |
53
+
| `cve-count` | — | `0` | Optional. CVE count to bake into the signed chain payload. Most users leave this at `0` — LedgerProve runs its own CVE scan against OSV.dev after every signed build and exposes the real findings on your dashboard. This field exists for callers who want to record a count from their own scanner inside the signature. |
54
54
| `api-url` | — | `https://api.ledgerprove.com` | Override the LedgerProve API URL. Only set this for self-hosted/staging. |
Sigstore uses keyless signing through a transparency log and a public Certificate Authority (Fulcio). It's a great fit if you want zero key management and are happy depending on a CA.
146
+
147
+
LedgerProve doesn't use a CA. Each organisation has a long-lived ECDSA-P521 key held inside a hardware-backed KMS, and records are appended to a per-org hash chain. The trade-off:
148
+
149
+
- **Sigstore wins** if you want true keyless signing with a public transparency log
150
+
- **LedgerProve wins** if you want signing without a CA dependency, with FIPS-aligned crypto, and a single-step CI integration
151
+
152
+
Both produce verifiable artifacts; the trust models differ.
153
+
154
+
### Why ECDSA-P521 instead of Ed25519?
155
+
156
+
P521 is FIPS-186-5 approved (matters for some customers' compliance reviews) and AWS KMS supports it for signing today; Ed25519 in KMS is still not GA. We'd switch when Ed25519 lands.
157
+
158
+
### Why a hash chain instead of a Merkle tree / transparency log?
159
+
160
+
A per-org hash chain is simpler operationally and gives the same tamper-evidence properties for a single organisation's history. A global Merkle log (like Rekor) gives cross-org public auditability — useful if you're publishing widely-consumed artifacts, less useful for internal SBOMs. We chose the simpler model for the MVP.
161
+
162
+
### Does the action send my SBOM contents to your servers?
163
+
164
+
No. The action computes a SHA-256 of the SBOM locally and sends only the hash + metadata. The SBOM body never leaves your runner. The signed record references the hash, not the file. (Trade-off: you need to keep the SBOM retrievable yourself if you want full reproducibility later — sigstore goes the other way with attestation bundles.)
165
+
166
+
### What happens if your service goes down?
167
+
168
+
Already-signed records remain verifiable forever using the public key at `https://api.ledgerprove.com/.well-known/public-key.pem`. If you cache the public key locally, you can verify signatures with OpenSSL even if our API is unreachable. New signings would obviously fail until we're back up.
169
+
170
+
### Is there a free plan?
171
+
172
+
Yes — 1 repository, unlimited builds, no credit card. The open-source action and the public verify endpoint are free on every plan. See https://ledgerprove.com/pricing for paid tiers (more repos, longer history retention, SBOM diff, CVE email alerts).
173
+
174
+
### Why is `dist/` checked in?
175
+
176
+
GitHub Actions runs the compiled JavaScript directly — there's no install step at action runtime. The compiled output has to be in the repo. We rebuild `dist/` on every change in `src/`.
0 commit comments