- Was ist NuGet?
- Wichtige Erkenntnisse
- Umgebungsmatrix
- Lassen Sie uns über den Paketfluss sprechen
- Grundlegendes zur NuGet-Signierung
- Allgemeine Anforderungen der NuGet-Signierung
- Mindestanforderungen für Zertifikate
- Unterstützte Algorithmen:
- NuGet-Signatur-Workflow – Signieren eines Pakets
- Die eigentlichen Signier- und Verifizierungsbefehle
- Häufige Fehler
- CI/CD-Nutzung und -Bereinigung
- Häufig gestellte Fragen
- Fazit
- Referenzen: (Die Referenzliste bleibt in der wissenschaftlichen Zitierweise erhalten)
Was ist NuGet?
NuGet ist der offizielle Paketmanager für das .Net-Ökosystem. Es bietet Plattformen und Tools, die Entwicklern das Erstellen, Veröffentlichen und Nutzen von .Net-Paketen erleichtern. Sie fragen sich jetzt bestimmt: Was ist ein Paket? Pakete sind im Allgemeinen kompilierte Bibliotheken, die mit beschreibenden Metadaten zu einer benutzerfreundlichen, gemeinsam nutzbaren Einheit gepackt sind. NuGets Aufgabe ist es, diese Bibliotheken in Form von Paketen so zugänglich und leicht zugänglich wie möglich zu machen. NuGet unterstützt Entwickler dabei, ein gesamtes Ökosystem zu nutzen und auf bestehenden Lösungen aufzubauen, anstatt alles von Grund auf neu zu entwickeln.
Lesen Sie den folgenden Artikel, um besser zu verstehen, was NuGet Signing ist.
Signieren eines NuGet-Pakets, kurz gesagt: Lauf
nuget sign <package.nupkg> -CertificatePath <cert.pfx> -Timestamper <timestamp_url>(oder die neueredotnet nuget signäquivalent), dann überprüfen mitnuget verify -Signatures <package.nupkg>Das Signaturzertifikat muss für die id-kp-codeSigning EKU gültig sein, einen RSA-Schlüssel von mindestens 2048 Bit besitzen und darf nicht die lifetime-signing EKU enthalten.
Wichtige Erkenntnisse
- Ein NuGet-Paket darf genau eine primäre Signatur haben (Autor oder Repository); eine gemeinsame Signatur ist in der Spezifikation ausdrücklich nicht zulässig.
- Das Zertifikat darf NICHT die EKU für lebenslanges Signieren (1.3.6.1.4.1.311.10.3.13) enthalten. Dies ist eine zwingende Voraussetzung, keine Empfehlung, und ein Zertifikat mit dieser EKU wird abgelehnt.
Umgebungsmatrix
| Komponente | Anforderung |
|---|---|
| Werkzeugbau | nuget.exe CLI oder dotnet nuget sign/verify (verfügbar im .NET SDK) |
| Zertifikat EKU | id-kp-codeSigning (RFC 5280 §4.2.1.12); darf NICHT die EKU für die lebenslange Signatur haben. |
| Zertifikatsschlüssel | RSA, 2048 Bit oder höher |
| Unterstützte Hash-Algorithmen | SHA-2-256, SHA-2-384, SHA-2-512 |
| Zeitstempelzertifikat | id-kp-timeStamping EKU, RSA 2048-Bit Minimum |
| Primäre Signaturen pro Paket | Genau einer (Autor oder Repository); Mitunterzeichnung wird nicht unterstützt |
Lassen Sie uns über den Paketfluss sprechen
In seiner öffentlichen Funktion ist NuGet wie eine große Bibliothek ( nuget.org ) mit über 100,000 verschiedenen Paketen. Diese Pakete werden täglich von vielen .NET/.NET Core-Entwicklern verwendet. Mit NuGet können Sie auch Ihre eigene Bibliothek in der Cloud (z. B. auf Azure DevOps), in einem privaten Netzwerk oder einfach auf Ihrem Computer betreiben. So können nur bestimmte Entwickler mit Zugriff auf die Bibliothek diese Pakete nutzen, und Sie können sie mit einer bestimmten Gruppe teilen. Weitere Informationen zu diesen Optionen finden Sie unter „Hosting your own NuGet feeds“. Durch die entsprechende Konfiguration können Sie steuern, aus welchen Bibliotheken ein Computer Pakete beziehen kann, und sicherstellen, dass diese aus bestimmten Quellen und nicht nur aus der großen öffentlichen Bibliothek (nuget.org) stammen.
Eine Bibliothek ist wie ein Treffpunkt für Paketersteller und Paketnutzer. Ersteller erstellen hilfreiche NuGet-Pakete und stellen sie in einer Bibliothek bereit. Benutzer suchen dann in verfügbaren Bibliotheken nach nützlichen Paketen, laden sie herunter und fügen sie ihren Projekten hinzu. Sobald diese Tools in einem Projekt vorhanden sind, können sie im restlichen Projektcode verwendet werden.
Bevor wir uns eingehend mit der NuGet-Signierung befassen, sollten wir verstehen, was Code-Signierung ist.
Die Codesignierung ist ein kryptografisches Verfahren, bei dem Software mit einer digitalen Signatur versehen wird, um ihre Herkunft zu verifizieren und Manipulationen auszuschließen. Diese digitale Signatur wird mit einem privaten Schlüssel erzeugt und kann mit dem zugehörigen öffentlichen Schlüssel verifiziert werden. Dadurch erhalten die Nutzer die Gewissheit, dass der Code authentisch und integer ist.
Hauptvorteile der Code-Signierung:
-
Authentizität
Durch die Code-Signierung wird die Identität des Softwareherausgebers überprüft und sichergestellt, dass Benutzer der Codequelle vertrauen können.
-
Integrität
Durch das Anhängen einer digitalen Signatur an den Code können nicht autorisierte Änderungen erkannt und so vor Manipulationen geschützt werden.
-
Manipulationssichere Verteilung
Durch die Code-Signierung können Entwickler ihre Software sicher verteilen und so das Risiko böswilliger Änderungen während der Übertragung verringern.
Grundlegendes zur NuGet-Signierung
Wie bereits erwähnt, ist NuGet ein beliebter Paketmanager für die .NET-Entwicklung, der Entwicklern die einfache Freigabe und Nutzung von Code ermöglicht. Die NuGet-Signierung ist eine auf NuGet-Pakete zugeschnittene Erweiterung der Code-Signierung. Beim Signieren eines NuGet-Pakets wird eine digitale Signatur hinzugefügt, die dieselben Vorteile wie die herkömmliche Code-Signierung bietet und die Authentizität und Integrität des gepackten Codes gewährleistet.
Allgemeine Anforderungen der NuGet-Signierung
-
Stellen Sie sicher, dass ein signiertes Paket mit Paketlesern und -schreibern kompatibel bleibt, die keine Unterstützung für die Paketsignierung haben.
-
Integrieren Sie die Paketsignatur detailliert in die Paketdatei.
-
Halten Sie sich strikt an die Regel, dass jedes signierte Paket genau eine primäre Signatur enthalten muss. (Mitsignierung ausdrücklich nicht erlaubt)
-
Idealerweise legen Sie die primäre Signatur entweder als Autoren- oder Repository-Signatur fest.
-
Stellen Sie beim Anwenden einer Autorensignatur sicher, dass diese als primäre Signatur dient. Entfernen Sie die vorhandene primäre Signatur, bevor Sie einem bereits signierten Paket eine Autorensignatur hinzufügen.
Mindestanforderungen für Zertifikate
Ein NuGet-Signaturzertifikat MUSS die folgenden Mindestanforderungen erfüllen:
-
Das Zertifikat MUSS für den Zweck der id-kp-Codesignierung gültig sein [RFC 5280 Abschnitt 4.2.1.12].
-
Das Zertifikat MUSS einen RSA- öffentlichen Schlüssel mit einer Länge von mindestens 2048 Bit aufweisen.
Ein Zeitstempelzertifikat MUSS die folgenden Mindestanforderungen erfüllen:
-
Das Zertifikat MUSS für den Zweck des ID-KP-TimeStamping gültig sein [RFC 5280 Abschnitt 4.2.1.12].
-
Das Zertifikat MUSS einen öffentlichen RSA-Schlüssel mit einer Länge von 2048 Bit oder mehr haben.
Zum Zeitpunkt der Signierung muss das Zertifikat gemäß dem Paketschreiber innerhalb seiner Gültigkeitsdauer liegen und darf nicht widerrufen sein. Bei der Validierung sollte der Widerrufsstatus des Zertifikats erneut überprüft werden; allerdings können Paketleser das Paket möglicherweise nicht öffnen, wenn der Widerrufsstatus nicht verfügbar ist (z. B. wenn eine Sperrliste (CRL) nicht zugänglich ist).
Zertifikate DÜRFEN NICHT über die lebenslange Signatur-EKU (1.3.6.1.4.1.311.10.3.13) verfügen.
Unterstützte Algorithmen:
Die folgenden Hash-Algorithmen MÜSSEN unterstützt werden:
| Hash-Algorithmus | Hash-Algorithmus-Oid |
| SHA-2-256 | 2.16.840.1.101.3.4.2.1 |
| SHA-2-384 | 2.16.840.1.101.3.4.2.2 |
| SHA-2-512 | 2.16.840.1.101.3.4.2.3 |
NuGet-Signatur-Workflow – Signieren eines Pakets
Die folgenden Schritte werden für den Autor beschrieben, der ein Paket signiert.
Schritt 1: Prüfen Sie, ob das Paket unterschrieben ist.
- Wenn das Paket signiert ist und der Signiervorgang sollte nicht eine vorhandene Signatur überschreiben – der Signiervorgang schlägt mit der Meldung „Das Paket ist bereits signiert“ fehl.
- Wenn das Paket signiert ist und der Signiervorgang sollte eine vorhandene Signatur überschreiben – die vorhandene Signatur entfernen und Schritt 2 befolgen
- Wenn das Paket nicht signiert ist, fahren Sie mit Schritt 2 fort
Schritt 2 : Überprüfen Sie, ob das Signaturzertifikat die Mindestanforderungen (wie oben erwähnt) erfüllt.
Schritt 3: Überprüfen Sie, ob die unterstützten Hash- , Signatur- und Zeitstempel-Hash-Algorithmen verwendet werden (wie oben erwähnt).
Schritt 4: Paketsignaturdatei generieren
- Autorensignatur erstellen
- Erhalten Sie einen Zeitstempel aus der Autorensignatur
Bitte überprüfen Sie, ob das Zeitstempel-Signaturzertifikat die Mindestanforderungen für Zertifikate (wie oben erwähnt) erfüllt und den unterstützten Hash-Algorithmus verwendet.
- Erweitern Sie die Autorensignatur auf CAdES-T [RFC 5126]
- Kodieren Sie die Autorensignatur CMS SignedData
- Schreiben Sie die codierte Autorensignatur in die Datei
Schritt 5: Fügen Sie die Paketsignaturdatei als unkomprimierte (gespeicherte) Datei zum zu signierenden Paket hinzu.
Schritt 6: Signiertes Paket validieren
- Stellen Sie fest, ob das Paket signiert ist (wenn nicht, beenden Sie die Validierung sofort).
- Stellen Sie sicher, dass es sich bei der Paketsignaturdatei um eine unkomprimierte und reguläre Datei handelt.
- Überprüfen Sie, ob das Paketsignaturformat unterstützt wird.
- Überprüfen der Paketintegrität
- Überprüfen Sie die Gültigkeit und Vertrauenswürdigkeit der Primärsignatur
- Wenn keine Fehler aufgetreten sind, behandeln Sie das Paket als gültiges signiertes Paket.
Die eigentlichen Signier- und Verifizierungsbefehle
Direkte Verwendung einer Zertifikatsdatei:
nuget sign MyPackage.nupkg -CertificatePath cert.pfx -CertificatePassword -Timestamper http://timestamp.digicert.com
Verwendung eines bereits im Zertifikatsspeicher installierten Zertifikats (typisch, wenn der KSP dort einen HSM-gestützten Schlüssel registriert):
nuget sign MyPackage.nupkg -CertificateStoreName My -CertificateStoreLocation CurrentUser -CertificateSubjectName " -Timestamper http://timestamp.digicert.com
Das neuere .NET SDK stellt dieselbe Funktionalität bereit über dotnet nuget sign <package.nupkg> --certificate-path cert.pfx --timestamper http://timestamp.digicert.comÜberprüfen Sie ein signiertes Paket mit:
nuget verify -Signatures MyPackage.nupkg
Bei einer erfolgreichen Überprüfung wird die Gültigkeit der Signatur bestätigt und das Signaturzertifikat genannt; bei einem Fehler wird der spezifische Validierungsschritt, der fehlgeschlagen ist (Signaturformat, Paketintegrität oder Vertrauenswürdigkeit), anstatt einer allgemeinen Fehlermeldung angegeben. Dies ist hilfreich, um festzustellen, welche der oben genannten Anforderungen nicht erfüllt wurde.
Häufige Fehler
| Fehler | Wahrscheinliche Ursache | Fixieren |
|---|---|---|
| „Das Paket ist bereits unterschrieben.“ | Der Versuch, ein Paket zu signieren, das bereits eine primäre Signatur besitzt, ohne diese vorher zu entfernen. | Entfernen Sie die bestehende Signatur vor dem erneuten Signieren, da eine Gegenzeichnung nicht unterstützt wird. |
| Das Zertifikat wurde bei der Unterzeichnung abgelehnt. | Das Zertifikat besitzt entweder die EKU für die lebenslange Signatur, einen RSA-Schlüssel unter 2048 Bit oder es fehlt die EKU id-kp-codeSigning. | Vergewissern Sie sich, dass das Zertifikat alle drei Mindestanforderungen erfüllt, bevor Sie es unterschreiben. |
| Die Verifizierung schlägt aufgrund eines Vertrauensfehlers fehl. | Die Zertifikatskette führt nicht zu einer vertrauenswürdigen Stammzertifizierungsstelle, oder das Zertifikat wurde nach der Signierung widerrufen. | Stellen Sie sicher, dass die Zertifizierungsstelle von der Umgebung, die das Paket verifiziert, als vertrauenswürdig eingestuft wird, und prüfen Sie den Sperrstatus. |
CI/CD-Nutzung und -Bereinigung
Für wiederholte Signierungen in einer Pipeline sollten Sie den Zertifikatspfad und die Zeitstempel-URL als Pipeline-Variablen anstatt fest codierter Werte angeben und hinzufügen. nuget verify -Signatures Als obligatorischer Schritt direkt nach der Signierung sollte der Build fehlschlagen, anstatt ein nicht verifizierbares Paket zu veröffentlichen. Wurde eine .pfx-Zertifikatsdatei zu Testzwecken auf einen Build-Agenten kopiert, sollte diese nach Bestätigung der Pipeline-Funktionalität entfernt werden. In Produktionspipelines ist die zertifikatspeicherbasierte Signierung (bei der der Schlüssel HSM-gesichert bleibt) der dateibasierten Signierung vorzuziehen.
Häufig gestellte Fragen
Kann ich ein NuGet-Paket mit mehr als einem Zertifikat signieren?
Nein. Die NuGet-Signaturspezifikation verbietet ausdrücklich die gemeinsame Unterzeichnung; ein Paket darf nur eine primäre Signatur haben, entweder eine Autorensignatur oder eine Repository-Signatur.
Warum verbietet die Spezifikation die Verwendung von EKU mit lebenslanger Signatur?
Die EKU mit lebenslanger Signierzeit ist so konzipiert, dass eine Signatur unabhängig vom Ablaufdatum des Zertifikats unbegrenzt gültig bleibt. Dies steht im Widerspruch zum NuGet-Modell, Zertifikate anhand ihrer angegebenen Gültigkeitsdauer und ihres Widerrufsstatus zum Zeitpunkt der Signierung zu validieren.
Fazit
NuGet ist ein kostenloser Open-Source-Paketmanager für das .NET-Ökosystem. Angesichts zunehmender Angriffe auf die Software-Lieferkette ist die Implementierung robuster Sicherheitsmaßnahmen wie Codesignierung und NuGet-Signierung unerlässlich. Diese Verfahren schaffen Vertrauen in die Software-Lieferkette und geben Entwicklern und Endnutzern die Gewissheit, dass der verwendete Code authentisch und integer ist.
CodeSign Secure ermöglicht das problemlose Signieren von NuGet-Paketen. Mit der CodeSign Secure-Lösung von Encryption Consulting bieten wir einen hocheffektiven und effizienten Ansatz zum Signieren von NuGet-Paketen. Unsere Lösung gewährleistet nicht nur die Sicherheit Ihrer Pakete durch robuste kryptografische Maßnahmen, sondern optimiert auch den Signierungsprozess und steigert so die Effizienz Ihres gesamten Softwareentwicklungszyklus.
Referenzen: (Die Referenzliste bleibt in der wissenschaftlichen Zitierweise erhalten)
RFC 5126 – CMS Erweiterte elektronische Signaturen (CAdES) (ietf.org)
RFC 3161 – Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP) (ietf.org)
- Was ist NuGet?
- Wichtige Erkenntnisse
- Umgebungsmatrix
- Lassen Sie uns über den Paketfluss sprechen
- Grundlegendes zur NuGet-Signierung
- Allgemeine Anforderungen der NuGet-Signierung
- Mindestanforderungen für Zertifikate
- Unterstützte Algorithmen:
- NuGet-Signatur-Workflow – Signieren eines Pakets
- Die eigentlichen Signier- und Verifizierungsbefehle
- Häufige Fehler
- CI/CD-Nutzung und -Bereinigung
- Häufig gestellte Fragen
- Fazit
- Referenzen: (Die Referenzliste bleibt in der wissenschaftlichen Zitierweise erhalten)
