Skip to content

Document the SmartScreen prompt a downloaded installer raises - #224

Merged
Sev7eNup merged 1 commit into
mainfrom
docs/smartscreen-and-mark-of-the-web
Aug 16, 2026
Merged

Document the SmartScreen prompt a downloaded installer raises#224
Sev7eNup merged 1 commit into
mainfrom
docs/smartscreen-and-mark-of-the-web

Conversation

@Sev7eNup

Copy link
Copy Markdown
Owner

Was ausgelöst hat

Der manuelle Start des veröffentlichten NodePilot-Server-Setup-1.2.10.exe zeigte das blaue „Der Computer wurde durch Windows geschützt"-Fenster — bei keinem früheren Build je aufgetreten. Vermutet wurde ein Zusammenhang mit Defender-Ausnahmen oder eine Produktänderung. Beides trifft nicht zu:

Beleg Ergebnis
Zone.Identifier der geklickten Datei (~\Downloads\) ZoneId=3, Host release-assets.githubusercontent.com
dieselbe Prüfung für 1.2.7–1.2.9 aus out\ und deploy\server\out\ kein Stream — lokal gebaut
SHA-256 Download vs. lokaler Build identisch, deckt sich mit SHA256SUMS.txt
Signatur 1.2.5 / 1.2.7 / 1.2.10 identisch, 277EAB31…, RFC3161-Zeitstempel vorhanden
git diff v1.2.7..v1.2.10 -- deploy/ Signierblock unberührt

SmartScreen bewertet nur Dateien mit Mark of the Web. Es war der erste Start eines heruntergeladenen Releases; das selbstsignierte Zertifikat trägt keine Reputation, also ist der Dialog ab da garantiert.

Was die Doku bisher sagte — und was fehlte

„SmartScreen" kam an sieben Stellen vor, durchgehend als „ein unsigniertes Setup löst SmartScreen aus". Das ist irreführend: Das signierte warnt genauso. Mark of the Web, Zone.Identifier, Unblock-File, Attachment Manager: repo-weit null Treffer. Damit fehlte genau die Information, die die Überraschung auflöst.

Änderungen

  • docs/deployment-guide.md — neuer Abschnitt First run: the SmartScreen prompt: warum beim Download und nicht beim lokalen Build, der Nachweis über Zone.Identifier, und die Reihenfolge, auf die es ankommt — erst Prüfsumme und Publisher-Thumbprint vergleichen, dann wegklicken. Dazu der bisher nirgends dokumentierte ZIP-Fall: Install-NodePilot.ps1 entpackt ein heruntergeladenes Archiv und führt PowerShell daraus aus, und entpackte Dateien erben die Markierung.
  • docs/av-exclusions.md — die Abgrenzung ausgesprochen, weil sie die eigentliche Frage war: Das Dokument adressiert den Virenscanner; SmartScreen ist ein getrennter Reputationsdienst und ignoriert Ausschlusslisten. Zusätzlich np.exe und nodepilot-mcp.exe nachgetragen — seit 1.2.8 ausgeliefert und nie eingepflegt, mit dem Hinweis, dass beide Client-Binaries nicht Authenticode-signiert sind und die dokumentierte Rangfolge „Publisher → Prozess → Pfad" dort deshalb nicht bei Publisher beginnen kann.
  • README.md + Build-Artifact.ps1 — „unsigned installer warns" ersetzt: Signieren beseitigt SmartScreen nicht.
  • Docs-Website (production.md, installation.md, desktop.md, av-exclusions.md) — derselbe Inhalt im kuratierten Korpus.
  • deploy/README.md — Punkt in der Release-Anleitung: Der Absatz gehört in den Release-Body, damit er nicht bei jedem Release neu erfunden wird.

Verifikation

  • deploy\Test-DeploymentTemplates.ps1 → Exit 0.
  • npm run build in src/nodepilot-docs-ui → grün.
  • Anker der neuen Querverweise gegen github-slugger geprüft statt geraten: Beim ersten Start: das blaue SmartScreen-Fensterbeim-ersten-start-das-blaue-smartscreen-fenster, First run: the SmartScreen promptfirst-run-the-smartscreen-prompt.
  • Anleitung an der auslösenden Datei nachvollzogen: Unblock-File entfernt den Stream, SHA-256 bleibt unverändert und deckt sich weiter mit SHA256SUMS.txt.

Nicht Teil dieser Änderung

Kein OV/EV-Zertifikat — die einzige echte Abhilfe, aber eine Beschaffungsentscheidung. Am Signieren selbst nichts geändert; /fd SHA256 /td SHA256 /tr mit DigiCert-Zeitstempel vor der Prüfsummenbildung ist korrekt.

Starting the published 1.2.10 server setup showed the blue "Windows protected
your PC" window, which no earlier build had ever produced. Nothing about the
product or the signing changed: same certificate, same thumbprint, RFC3161
timestamp, and the diff of deploy/ between v1.2.7 and v1.2.10 does not touch the
signing block. What changed is where the file came from. SmartScreen only
evaluates files carrying a Mark of the Web, the downloaded copy has ZoneId=3 from
release-assets.githubusercontent.com, and every installer run before it was built
locally and carried no such stream. With a self-signed publisher there is no
reputation to weigh, so the prompt is guaranteed from the first download onward.

The repository half-explained this. SmartScreen appeared in seven places, always
as "an UNSIGNED installer warns", which is misleading -- the signed one warns too.
Mark of the Web, Zone.Identifier, Unblock-File and the Attachment Manager had no
mention at all, so the one fact that resolves the surprise was missing: a
downloaded release warns where the identical local build does not.

deployment-guide.md gains the explanation and the order that matters -- compare
the checksum and the publisher thumbprint FIRST, then dismiss the dialog -- plus
the ZIP case, which nothing covered: Install-NodePilot.ps1 unpacks a downloaded
archive and runs PowerShell out of it, and files extracted from a marked ZIP
inherit the mark. README.md and the Build-Artifact parameter docs drop the
"unsigned" framing.

av-exclusions.md gets the boundary stated outright, because that was the actual
question asked: it covers the virus scanner, SmartScreen is a separate reputation
service and ignores exclusion lists. It also picks up np.exe and
nodepilot-mcp.exe, shipped since 1.2.8 and never added -- with the note that
neither client binary is Authenticode-signed, so the document's own
"publisher before process before path" ranking cannot start at publisher here.

The docs site carries the same content; its cross-reference anchors were verified
against github-slugger rather than assumed.
@Sev7eNup
Sev7eNup merged commit 37c831d into main Aug 16, 2026
9 checks passed
@Sev7eNup
Sev7eNup deleted the docs/smartscreen-and-mark-of-the-web branch August 16, 2026 19:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant