Hoppa till innehĂĄll

47-dagarscertifikaten är på väg. Är du redo?

Agera nu →

Allt du behöver veta om NuGet-signering

Allt om Nugget-signering

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 nyare dotnet nuget sign motsvarande), verifiera sedan med nuget 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

KomponentKrav
Verktygnuget.exe CLI, eller dotnet nuget signera/verifiera (tillgängligt i .NET SDK)
Certifikat EKUid-kp-codeSigning (RFC 5280 §4.2.1.12); får INTE ha livstidssignerings-EKU
CertifikatnyckelRSA, 2048 bitar eller högre
Stödda hashalgoritmerSHA-2-256, SHA-2-384, SHA-2-512
Tidsstämpelcertifikatid-kp-timeStamping EKU, RSA 2048-bitars minimum
Primära signaturer per paketExakt 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:

  1. Autencitet

    Kodsignering verifierar programvaruutgivarens identitet, vilket säkerställer att användarna kan lita på kodens källa.

  2. Integritet

    Att bifoga en digital signatur till koden kan upptäcka obehöriga ändringar och skydda mot manipulering.

  3. 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

  1. Säkerställ att ett signerat paket förblir kompatibelt med paketläsare och -skrivare som saknar stöd för paketsignering

  2. Integrera paketsignaturen på ett invecklat sätt i paketfilen.

  3. Följ strikt regeln att varje signerat paket ska innehålla exakt en primär signatur. (medsignering är uttryckligen förbjudet)

  4. Helst bör den primära signaturen anges som antingen en författar- eller en arkivsignatur.

  5. 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:

  1. Certifikatet MÅSTE vara giltigt för signeringsändamålet id-kp-codeSigning [RFC 5280 avsnitt 4.2.1.12].

  2. Certifikatet MÅSTE ha en RSA- nyckellängd på 2048 bitar eller högre.

Ett tidsstämplingscertifikat MÅSTE uppfylla följande minimikrav:

  1. Certifikatet MÅSTE vara giltigt för ändamålet id-kp-timeStamping [RFC 5280 avsnitt 4.2.1.12].

  2. 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).

Lösning för företagskodsignering

Få en lösning för alla dina behov av kodsignering och kryptografi för mjukvara med vår kodsigneringslösning.

Stödda algoritmer:

Följande hashalgoritmer MÅSTE stödjas:

Hash-algoritmHash-Algoritm-Oid
SHA-2-2562.16.840.1.101.3.4.2.1
SHA-2-3842.16.840.1.101.3.4.2.2
SHA-2-5122.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

  1. 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".
  2. Om paketet är signerat och signeringsoperationen skall skriv över en befintlig signatur – ta bort den befintliga signaturen och följ steg 2
  3. 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

  1. Skapa författarsignatur
  2. 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.

  3. Utöka författarsignaturen till CAdES-T [RFC 5126]
  4. Koda författarsignaturen CMS SignedData
  5. 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

  1. Avgör om paketet är signerat (om det inte är signerat, stoppa valideringen omedelbart)
  2. Verifiera att paketsignaturfilen är en okomprimerad och vanlig fil.
  3. Kontrollera att paketets signaturformat stöds.
  4. Verifiera paketets integritet
  5. Verifiera giltighet och förtroende för den primära signaturen
  6. 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

FelTroligtvis orsakFast
"Paketet är redan signerat"Försöker signera ett paket som redan har en primär signatur utan att först ta bort denTa bort den befintliga signaturen innan du signerar på nytt, eftersom medsignering inte stöds.
Certifikatet avvisades under signeringCertifikatet har livstidssignerings-EKU, en RSA-nyckel under 2048 bitar, eller saknar id-kp-codeSigning EKUBekräfta att certifikatet uppfyller alla tre minimikrav innan du försöker signera
Verifieringen misslyckas med ett förtroendefelCertifikatkedjan matchar inte en betrodd rot, eller så återkallades certifikatet efter signeringBekrä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 5280 – Internet X.509 Public Key Infrastructure Certifikat och CRL-profil (Certificate Revocation List) (ietf.org)

RFC 3161 – Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP) (ietf.org)