- Vad är NuGet?
- Key Takeaways
- Miljömatris
- Låt oss prata om paketflödet
- Förstå NuGet-signering
- Allmänna krav för NuGet-signering
- Minimikrav för certifikat
- Stödda algoritmer:
- NuGet-signeringsarbetsflöde – Signera ett paket
- De faktiska signerings- och verifieringskommandona
- Vanliga fel
- Användning och rengöring av CI/CD
- Vanliga frĂĄgor om partihandel med mat och dryck
- Slutsats
- Referenser:
Vad är NuGet?
NuGet är den officiella pakethanteraren för .Net-ekosystemet. Den tillhandahåller plattformar och verktyg som hjälper utvecklare att skapa, publicera och använda .Net-paket. Du undrar säkert vad ett paket är! Paket kan generellt sett vara kompilerade bibliotek packade med beskrivande metadata till en snygg delbar enhet. NuGets jobb är att göra dessa bibliotek så tillgängliga och enkla att dela som möjligt i form av paket. NuGet hjälper utvecklare att utnyttja ett helt ekosystem och bygga vidare på befintliga lösningar istället för att bygga allt från grunden.
Läs igenom artikeln nedan för att bättre förstå vad NuGet-signering är.
Att signera ett NuGet-paket, kortfattat: köra
nuget sign <package.nupkg> -CertificatePath <cert.pfx> -Timestamper <timestamp_url>(eller den nyaredotnet nuget signmotsvarande), verifiera sedan mednuget verify -Signatures <package.nupkg>Signeringscertifikatet måste vara giltigt för id-kp-codeSigning EKU, ha en RSA-nyckel på 2048 bitar eller högre och får inte innehålla livstidssignerings-EKU:n.
Key Takeaways
- Ett NuGet-paket kan ha exakt en primär signatur (författare eller arkiv); medsignering är uttryckligen otillåtet enligt specifikationen.
- Certifikatet får INTE ha livstidssignerings-EKU (1.3.6.1.4.1.311.10.3.13). Detta är ett hårt krav, inte en rekommendation, och ett certifikat med denna EKU kommer att avvisas.
Miljömatris
| Komponent | Krav |
|---|---|
| Verktyg | nuget.exe CLI, eller dotnet nuget signera/verifiera (tillgängligt i .NET SDK) |
| Certifikat EKU | id-kp-codeSigning (RFC 5280 §4.2.1.12); får INTE ha livstidssignerings-EKU |
| Certifikatnyckel | RSA, 2048 bitar eller högre |
| Stödda hashalgoritmer | SHA-2-256, SHA-2-384, SHA-2-512 |
| Tidsstämpelcertifikat | id-kp-timeStamping EKU, RSA 2048-bitars minimum |
| Primära signaturer per paket | Exakt en (författare eller arkiv); medsignering stöds inte |
Låt oss prata om paketflödet
I sin offentliga roll är NuGet som ett stort bibliotek ( nuget.org ) med över 100 000 olika paket. Dessa paket används av många .NET/.NET Core-utvecklare varje dag. NuGet låter dig också ha ditt privata bibliotek i molnet (som på Azure DevOps), på ett privat nätverk eller bara på din dator. På så sätt kan bara vissa utvecklare med åtkomst till biblioteket använda dessa paket, och du kan dela dem med en specifik grupp. Du kan lära dig mer om dessa alternativ genom att vara värd för dina egna NuGet-flöden. Genom att konfigurera saker på ett visst sätt kan du styra vilka bibliotek en dator kan hämta paket från, och säkerställa att de kommer från specifika källor och inte bara det stora offentliga biblioteket (nuget.org).
Oavsett vad som händer är ett bibliotek som en mötesplats för paketskapare och paketanvändare. Skapare skapar användbara NuGet-paket och lägger dem i ett bibliotek. Användare letar sedan efter användbara paket i tillgängliga bibliotek, laddar ner dem och lägger till dem i sina projekt. Väl inne i ett projekt är dessa pakets verktyg redo att användas i resten av projektkoden.
Innan vi fördjupar oss i NuGet-signering, låt oss förstå vad kodsignering är.
Kodsignering är en kryptografisk process som innebär att en digital signatur kopplas till programvara för att verifiera dess ursprung och säkerställa att den inte har manipulerats. Denna digitala signatur genereras med hjälp av en privat nyckel och kan verifieras med motsvarande publika nyckel, vilket ger användarna förtroende för kodens äkthet och integritet.
Viktiga fördelar med kodsignering:
-
Autencitet
Kodsignering verifierar programvaruutgivarens identitet, vilket säkerställer att användarna kan lita på kodens källa.
-
Integritet
Att bifoga en digital signatur till koden kan upptäcka obehöriga ändringar och skydda mot manipulering.
-
Manipulationssäker distribution
Kodsignering gör det möjligt för utvecklare att distribuera sin programvara säkert, vilket minskar risken för skadliga ändringar under transport.
Förstå NuGet-signering
Som diskuterats ovan är NuGet en populär pakethanterare för .NET-utveckling, vilket gör det möjligt för utvecklare att enkelt dela och använda kod. NuGet-signering är en utökning av kodsignering skräddarsydd för NuGet-paket. När ett NuGet-paket signeras inkluderar det en digital signatur som ger samma fördelar som traditionell kodsignering, vilket säkerställer den paketerade kodens äkthet och integritet.
Allmänna krav för NuGet-signering
-
Säkerställ att ett signerat paket förblir kompatibelt med paketläsare och -skrivare som saknar stöd för paketsignering
-
Integrera paketsignaturen på ett invecklat sätt i paketfilen.
-
Följ strikt regeln att varje signerat paket ska innehålla exakt en primär signatur. (medsignering är uttryckligen förbjudet)
-
Helst bör den primära signaturen anges som antingen en författar- eller en arkivsignatur.
-
När du använder en författarsignatur, se till att den fungerar som den primära signaturen. Ta bort den befintliga primära signaturen innan du lägger till en författarsignatur i ett redan signerat paket.
Minimikrav för certifikat
Ett NuGet-signeringscertifikat MÅSTE uppfylla följande minimikrav:
-
Certifikatet MÅSTE vara giltigt för signeringsändamålet id-kp-codeSigning [RFC 5280 avsnitt 4.2.1.12].
-
Certifikatet MÅSTE ha en RSA- nyckellängd på 2048 bitar eller högre.
Ett tidsstämplingscertifikat MÅSTE uppfylla följande minimikrav:
-
Certifikatet MÅSTE vara giltigt för ändamålet id-kp-timeStamping [RFC 5280 avsnitt 4.2.1.12].
-
Certifikatet MÅSTE ha en RSA-nyckellängd på 2048 bitar eller högre.
Vid signeringstillfället MÅSTE ett certifikat vara inom sin giltighetstid enligt paketets författare och FÅR INTE återkallas. Vid valideringstillfället BÖR certifikatets återkallningsstatus kontrolleras på nytt; paketläsare KAN dock inte öppnas om återkallningsstatusen inte är tillgänglig (t.ex. om en CRL inte är tillgänglig).
Certifikat FĂ…R INTE ha livstidssignerings-EKU (1.3.6.1.4.1.311.10.3.13).
Stödda algoritmer:
Följande hashalgoritmer MÅSTE stödjas:
| Hash-algoritm | Hash-Algoritm-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-signeringsarbetsflöde – Signera ett paket
Följande steg beskrivs för författaren som signerar ett paket.
Steg 1: Avgör om paketet är signerat
- Om paketet är signerat och signeringsoperationen borde inte skriva över en befintlig signatur – signeringsåtgärden misslyckas med ett meddelande om att "paketet redan är signerat".
- Om paketet är signerat och signeringsoperationen skall skriv över en befintlig signatur – ta bort den befintliga signaturen och följ steg 2
- Om paketet inte är signerat, fortsätt med steg 2
Steg 2 : Kontrollera att signeringscertifikatet uppfyller minimikraven (som nämnts ovan)
Steg 3: Kontrollera att de hash- , signatur- och tidsstämpelalgoritmer som stöds används (som nämnts ovan).
Steg 4: Generera paketsignaturfil
- Skapa författarsignatur
- Hämta en tidsstämpel från författarsignaturen
Kontrollera att tidsstämpelns signeringscertifikat uppfyller certifikatets minimikrav (som nämnts ovan) och använder den hashalgoritm som stöds.
- Utöka författarsignaturen till CAdES-T [RFC 5126]
- Koda författarsignaturen CMS SignedData
- Skriv den kodade författarsignaturen till filen
Steg 5: Lägg till paketsignaturfilen som en okomprimerad (lagrad) fil till paketet som signeras
Steg 6: Validera det signerade paketet
- Avgör om paketet är signerat (om det inte är signerat, stoppa valideringen omedelbart)
- Verifiera att paketsignaturfilen är en okomprimerad och vanlig fil.
- Kontrollera att paketets signaturformat stöds.
- Verifiera paketets integritet
- Verifiera giltighet och förtroende för den primära signaturen
- Om inga fel har uppstĂĄtt, behandla paketet som ett giltigt signerat paket.
De faktiska signerings- och verifieringskommandona
Använda en certifikatfil direkt:
nuget signera MyPackage.nupkg -CertificatePath cert.pfx -CertificatePassword -Tidsstämpel http://timestamp.digicert.com
Med hjälp av ett certifikat som redan är installerat i certifikatarkivet (vanligt när KSP registrerar en HSM-baserad nyckel där):
nuget signera MyPackage.nupkg -CertificateStoreName My -CertificateStoreLocation CurrentUser -CertificateSubjectName " "-Tidsstämpel http://timestamp.digicert.com
Det nyare .NET SDK:et exponerar samma funktionalitet via dotnet nuget sign <package.nupkg> --certificate-path cert.pfx --timestamper http://timestamp.digicert.comVerifiera ett signerat paket med:
nuget verifiera -Signaturer MittPackage.nupkg
En lyckad verifiering rapporterar att signaturen är giltig och namnger signeringscertifikatet; ett fel namnger det specifika valideringssteg som misslyckades (signaturformat, paketintegritet eller förtroende) snarare än ett generiskt fel, vilket är användbart för att diagnostisera vilket krav ovan som inte uppfylldes.
Vanliga fel
| Fel | Troligtvis orsak | Fast |
|---|---|---|
| "Paketet är redan signerat" | Försöker signera ett paket som redan har en primär signatur utan att först ta bort den | Ta bort den befintliga signaturen innan du signerar på nytt, eftersom medsignering inte stöds. |
| Certifikatet avvisades under signering | Certifikatet har livstidssignerings-EKU, en RSA-nyckel under 2048 bitar, eller saknar id-kp-codeSigning EKU | Bekräfta att certifikatet uppfyller alla tre minimikrav innan du försöker signera |
| Verifieringen misslyckas med ett förtroendefel | Certifikatkedjan matchar inte en betrodd rot, eller så återkallades certifikatet efter signering | Bekräfta att certifikatutfärdaren är betrodd av miljön som verifierar paketet och kontrollera återkallningsstatusen. |
Användning och rengöring av CI/CD
För upprepad signering i en pipeline, ange certifikatets sökväg och tidsstämpelns URL som pipelinevariabler istället för att hårdkoda dem och lägg till nuget verify -Signatures som ett obligatoriskt steg omedelbart efter signering så att bygget misslyckas snarare än att ett overifierbart paket publiceras. Om en .pfx-certifikatfil kopierades till en byggagent för testning, ta bort den när pipelinen har bekräftats fungera och föredra certifikatarkivbaserad signering (som håller nyckeln HSM-baserad) framför filbaserad signering i produktionspipelines.
Vanliga frĂĄgor om partihandel med mat och dryck
Kan jag signera ett NuGet-paket med mer än ett certifikat?
Nej. Medsignering är uttryckligen otillåtet enligt NuGets signeringsspecifikation; ett paket kan ha exakt en primär signatur, antingen en författar- eller en arkivsignatur.
Varför förbjuder specifikationen livstidssignering av EKU?
Livstidssignerings-EKU:n är utformad för att göra att en signatur förblir giltig på obestämd tid oavsett certifikatets utgångsdatum, vilket strider mot NuGets modell för att validera certifikat mot deras angivna giltighetsperiod och återkallningsstatus vid signeringstillfället.
Slutsats
NuGet är en gratis pakethanterare med öppen källkod för .NET-ekosystemet. I en värld där attacker i programvaruleveranskedjan ökar är det viktigt att implementera robusta säkerhetsåtgärder som kodsignering och NuGet-signering. Dessa metoder inger förtroende i programvaruleveranskedjan, vilket ger utvecklare och slutanvändare förtroende för äktheten och integriteten hos den kod de använder.
CodeSign Secure hjälper dig att signera NuGet-paket utan krångel. Med Encryption Consultings CodeSign Secure-lösning erbjuder vi en mycket effektiv och ändamålsenlig metod för att signera NuGet-paket. Vår lösning säkerställer inte bara säkerheten för dina paket genom robusta kryptografiska åtgärder utan effektiviserar även signeringsprocessen, vilket förbättrar den totala effektiviteten i din programvaruutvecklingslivscykel.
Referenser:
RFC 5126 – CMS Avancerade elektroniska signaturer (CAdES) (ietf.org)
RFC 3161 – Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP) (ietf.org)
- Vad är NuGet?
- Key Takeaways
- Miljömatris
- Låt oss prata om paketflödet
- Förstå NuGet-signering
- Allmänna krav för NuGet-signering
- Minimikrav för certifikat
- Stödda algoritmer:
- NuGet-signeringsarbetsflöde – Signera ett paket
- De faktiska signerings- och verifieringskommandona
- Vanliga fel
- Användning och rengöring av CI/CD
- Vanliga frĂĄgor om partihandel med mat och dryck
- Slutsats
- Referenser:
