Skip to content

Commit afed612

Browse files
docs: reframe code-signing section after SignPath Foundation declined
SignPath Foundation declined PowerNetbox's OSS application on 2026-04-24 citing insufficient external reputation signals. Removes "application in progress" language from SECURITY.md and README.md and promotes GitHub build-provenance attestations (already live since PR #406 via actions/attest-build-provenance@v2) to the primary authenticity anchor. - SECURITY.md: rename "Code signing" -> "Authenticity & provenance"; add gh attestation verify snippet as the first trust anchor - README.md: rename "Code signing policy" -> "Authenticity & provenance"; drop Get-AuthenticodeSignature snippet (misleading for an unsigned module — would report NotSigned) and SignPath credit block; add explanatory note on Authenticode - release.yml: update comment on the attestation step to reflect that it is the sole authenticity anchor, not a stopgap A Foundation-backed cert may be revisited once the project grows enough to requalify.
1 parent 0ed8f51 commit afed612

3 files changed

Lines changed: 54 additions & 50 deletions

File tree

.github/workflows/release.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,10 @@ jobs:
8989
- name: Generate build provenance attestation
9090
# Creates a cryptographic attestation that this PowerNetbox.psd1 +
9191
# PowerNetbox.psm1 were built by THIS workflow run. Consumers can
92-
# verify via `gh attestation verify`. Free alternative to a paid
93-
# Authenticode code-signing certificate (SignPath application is
94-
# in progress separately for the full signature chain).
92+
# verify via `gh attestation verify`. This is the module's sole
93+
# authenticity anchor — PowerNetbox is distributed unsigned on
94+
# PSGallery (SignPath Foundation declined the OSS application
95+
# 2026-04-24; see SECURITY.md Authenticity & provenance section).
9596
uses: actions/attest-build-provenance@v2
9697
with:
9798
subject-path: |

README.md

Lines changed: 26 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -333,38 +333,32 @@ See also [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md).
333333
telemetry, no analytics.
334334
- **Recent security reviews:** `docs/superpowers/reviews/`.
335335

336-
## Code signing policy
337-
338-
PowerNetbox follows the [SignPath.io](https://signpath.org) code signing
339-
model (application in progress with the SignPath Foundation free open
340-
source tier). Once active:
341-
342-
- Every published release on PSGallery will be signed with a certificate
343-
issued to **ctrl-alt-automate / PowerNetbox** via SignPath.
344-
- Consumers can verify authenticity with:
345-
346-
```powershell
347-
$module = Get-Module -ListAvailable PowerNetbox |
348-
Sort-Object Version -Descending |
349-
Select-Object -First 1
350-
if ($module) {
351-
Get-AuthenticodeSignature $module.Path
352-
}
353-
```
354-
355-
- Team roles for signing governance:
356-
- **Author / Reviewer / Approver:** ctrl-alt-automate (solo
357-
maintainer; external contributions are reviewed and merged by the
358-
same maintainer before a signed release is cut).
359-
360-
Until SignPath signing is live, the module is distributed unsigned on
361-
PSGallery. Trust anchors meanwhile are the PSGallery publisher identity
362-
(`ctrl-alt-automate`), signed git tags, and the public MIT-licensed
363-
source at each release tag.
364-
365-
Credit: code signing sponsored by
366-
[SignPath Foundation](https://signpath.org) via
367-
[SignPath.io](https://signpath.io).
336+
## Authenticity & provenance
337+
338+
PowerNetbox is distributed **unsigned** on PSGallery. Authenticity is
339+
anchored in GitHub's Sigstore-backed build-provenance attestations,
340+
produced automatically for every release by
341+
[`actions/attest-build-provenance`](https://github.com/actions/attest-build-provenance).
342+
343+
Verify a downloaded module:
344+
345+
```powershell
346+
$module = Get-Module -ListAvailable PowerNetbox |
347+
Sort-Object Version -Descending |
348+
Select-Object -First 1
349+
350+
gh attestation verify $module.Path `
351+
--repo ctrl-alt-automate/PowerNetbox
352+
```
353+
354+
Additional trust anchors: PSGallery publisher identity
355+
(`ctrl-alt-automate`), signed git release tags, and the public MIT-licensed
356+
source at each tag.
357+
358+
**Note on Authenticode:** PowerNetbox has no Authenticode signature, so
359+
`Get-AuthenticodeSignature` will report `NotSigned` — this is expected.
360+
An OSS code-signing certificate may be revisited if the project grows
361+
enough to qualify for a Foundation-backed program.
368362

369363
## License
370364

SECURITY.md

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,30 @@ Current hardening includes:
7272
- Restricted GitHub Actions permissions (`contents: read` default)
7373
- Client-side 10 MB upload cap on `New-NBImageAttachment` (see `Functions/Extras/ImageAttachments/New-NBImageAttachment.ps1`); client-side default 10 000-item cap on `Send-NBBulkRequest` via `-MaxItems` (see `Functions/Helpers/Send-NBBulkRequest.ps1`). Both are local guards that throw before any network call — server-side limits from NetBox apply on top.
7474

75-
## Code signing
75+
## Authenticity & provenance
7676

77-
The published module on PSGallery is **not yet code-signed**. An
78-
application with [SignPath Foundation](https://signpath.org) for free
79-
open-source code signing is in progress. Until then, consumers can
80-
verify authenticity via:
77+
PowerNetbox is distributed **unsigned** on PSGallery. SignPath Foundation's
78+
free OSS code-signing program declined the application on 2026-04-24,
79+
citing insufficient external reputation signals (a common threshold for
80+
young/niche OSS projects).
8181

82-
1. **PSGallery publisher:** modules are published only by the
82+
Consumers can verify authenticity today via:
83+
84+
1. **GitHub build-provenance attestations** — every release is signed by
85+
GitHub's Sigstore-backed attestation service (wired in `release.yml` via
86+
`actions/attest-build-provenance@v2`):
87+
88+
```bash
89+
gh attestation verify PowerNetbox.psm1 \
90+
--repo ctrl-alt-automate/PowerNetbox
91+
```
92+
93+
2. **PSGallery publisher identity** — modules are published only by the
8394
`ctrl-alt-automate` publisher account.
84-
2. **Git tag SHA:** each release tag matches a commit on `main`; you
85-
can verify by inspecting `git log` on your local clone.
86-
3. **Review the source:** PowerNetbox is MIT-licensed; the full source
87-
of every released version is public at the matching tag.
88-
89-
Once SignPath signing is live, use the `Get-AuthenticodeSignature`
90-
snippet in [README.md → Code signing policy](README.md#code-signing-policy)
91-
to verify a local install. Signature verification steps are maintained
92-
in a single location to avoid drift.
95+
3. **Signed git tags** — each release tag matches a commit on `main`;
96+
`git log` on your local clone confirms the SHA.
97+
4. **Public MIT source** — every released version's source is public at
98+
the matching tag.
99+
100+
Code-signing certificates may be revisited if the project grows enough to
101+
requalify for a Foundation-backed cert.

0 commit comments

Comments
 (0)