Kodsignering med AWS KMS: installationsguide
Guiden beskriver hur du konfigurerar AWS KMS för kodsignering. AWS KMS ger HSM-skyddade nycklar (FIPS 140-2 Level 3 sedan maj 2023) till en låg månadskostnad, men du behöver Jsign för att signera och ett hjälpverktyg för att skapa CSR.
Fungerar med OV- och EV-certifikat för kodsignering från DigiCert och GlobalSign.
När passar AWS KMS för kodsignering?
AWS KMS passar om din organisation redan använder AWS och vill ha signeringsnycklarna i AWS. Installationen är mer krävande än för Azure Key Vault, och du måste signera med Jsign eftersom signtool.exe inte stöds.
AWS KMS (~10 kr/månad)
- ✓ RSA 4096, FIPS 140-2 Level 3
- ✓ Låg kostnad, du betalar per användning
- – Bara Jsign (inte signtool.exe)
- – CSR kräver ett hjälpverktyg
AWS CloudHSM (~150 000 kr/år)
- ✓ Fullt stöd för PKCS#11 och signtool.exe
- ✓ Dedikerad HSM-hårdvara
- – Orimligt dyrt
- – Lönar sig bara om ni redan har HSM-infrastruktur
Guiden handlar om AWS KMS, det billigare av de två alternativen. Behöver du signtool.exe och använder inte redan AWS är Azure Key Vault enklare.
Förutsättningar
- ✓ AWS-konto med behörighet att skapa KMS-nycklar
- ✓ AWS CLI v2 installerat och konfigurerat. Ladda ner från aws.amazon.com/cli ↗
- ✓ Java 11+ (för Jsign)
- ✓ Go eller Python (för hjälpverktyget som skapar CSR)
- ✓ Ett kodsigneringscertifikat från FairSSL (DigiCert eller GlobalSign). Se produkter nedan
Steg 1: Skapa en asymmetrisk KMS-nyckel
aws kms create-key \ --key-spec RSA_4096 \ --key-usage SIGN_VERIFY \ --description "Code Signing key" \ --tags TagKey=Purpose,TagValue=CodeSigning
Anteckna KeyId från svaret. Du behöver det i alla följande kommandon.
# Create an alias for easier reference aws kms create-alias \ --alias-name alias/codesign \ --target-key-id YOUR_KEY_ID
Nyckelinställningar
- Key spec:
RSA_4096(krävs för kodsignering) - Key usage:
SIGN_VERIFY(bara signering, inte kryptering) - Skydd: Alla nycklar i AWS KMS skyddas av HSM (FIPS 140-2 Level 3 sedan maj 2023)
Den privata nyckeln lämnar aldrig HSM. AWS KMS stöder inte export av nycklar, och all signering sker i HSM.
Steg 2: Konfigurera IAM-behörigheter
Skapa en IAM-användare eller IAM-roll för din signeringspipeline med behörighet att använda KMS-nyckeln.
Minsta IAM-policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Sign",
"kms:GetPublicKey",
"kms:DescribeKey"
],
"Resource": "arn:aws:kms:REGION:ACCOUNT:key/YOUR_KEY_ID"
}
]
}
För att skapa CSR behöver du även kms:GetPublicKey. För själva signeringen räcker kms:Sign.
Steg 3: Skapa CSR
AWS KMS kan inte skapa en CSR själv, till skillnad från Azure Key Vault. Du behöver ett hjälpverktyg som hämtar den offentliga nyckeln från KMS och skapar en korrekt formaterad CSR.
Alternativ A: aws-kms-sign-csr (Go)
Ett litet verktyg skrivet i Go som skapar en CSR signerad med KMS-nyckeln.
# Install go install github.com/AdrianHenworthy/aws-kms-sign-csr@latest # Generate CSR aws-kms-sign-csr \ --key-id alias/codesign \ --subject "CN=Your Company Name" \ --out codesign.csr
Alternativ B: Manuellt med AWS CLI och OpenSSL
Hämta den offentliga nyckeln från KMS och skapa en CSR manuellt:
# Get the public key aws kms get-public-key \ --key-id alias/codesign \ --output text \ --query PublicKey | base64 --decode > public-key.der # Convert to PEM openssl rsa -pubin -inform DER -in public-key.der -out public-key.pem # Create CSR (requires signing via KMS, not straightforward) # The aws-kms-sign-csr tool handles this automatically
Den manuella metoden är krånglig eftersom CSR:en måste signeras med den privata nyckeln,
vilket kräver ett anrop till kms:Sign med CSR:ens TBS-data (to-be-signed).
Hjälpverktygen sköter det åt dig.
Steg 4: Beställ certifikat och skicka in CSR
Ordningen skiljer sig mellan DigiCert och GlobalSign
DigiCert: CSR:en måste finnas klar innan ordern kan skapas. Den lämnas in som en del av beställningen.
GlobalSign: ordern skapas utan CSR. Organisationsvalideringen genomförs först, och CSR:en lämnas in efteråt via den utfärdandelänk GlobalSign skickar till godkännarens e-post.
I båda fallen ska en tekniskt ansvarig underteckna ett intyg om att den privata nyckeln har skapats och lagras i en HSM och inte kan exporteras.
- 1 Beställ ett kodsigneringscertifikat från FairSSL. Välj DigiCert eller GlobalSign, OV eller EV. Se produkter nedan.
- 2 Skicka in CSR-filen från steg 3, vid beställningen (DigiCert) eller via utfärdandelänken (GlobalSign).
- 3 Genomför organisationsvalideringen. FairSSL hjälper er genom valideringen.
- 4 Ta emot det utfärdade certifikatet från CA:n. Spara det som en PEM-fil (t.ex.
codesign-cert.pem).
Steg 5: Installera Jsign och signera
Jsign ↗ är det signeringsverktyg som används för kodsignering med AWS KMS. Det är gratis, har öppen källkod och fungerar på Windows, macOS och Linux. Kräver Java 11 eller senare.
Signera med Jsign
jsign --storetype AWS \ --keystore "eu-west-1" \ --alias "alias/codesign" \ --certfile codesign-cert.pem \ --tsaurl http://timestamp.digicert.com \ --tsmode RFC3161 \ MyApplication.exe
Parametrar
--storetype AWSAnvänd AWS KMS som nyckellager--keystoreAWS-region där nyckeln finns--aliasAlias eller nyckel-ID för KMS-nyckeln--certfileCertifikatet från CA:n (PEM-format)--tsaurlRFC 3161-tidsstämpelserver
Jsign autentiserar på samma sätt som andra AWS-verktyg: via miljövariabler (AWS_ACCESS_KEY_ID,
AWS_SECRET_ACCESS_KEY), AWS CLI-konfigurationen, instance profiles eller ECS task roles.
Integration i CI/CD
Jsign kan köras i alla CI/CD-pipelines där Java finns installerat. Lagra AWS-inloggningsuppgifterna som hemliga pipelinevariabler, eller använd IAM-roller för autentisering utan nycklar.
Exempel för GitHub Actions
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: eu-west-1
- name: Sign executable
run: |
jsign --storetype AWS \
--keystore eu-west-1 \
--alias alias/codesign \
--certfile codesign-cert.pem \
--tsaurl http://timestamp.digicert.com \
--tsmode RFC3161 \
"output/MyApplication.exe" Signering i Docker
I pipelines som körs i containrar kan du använda en Docker-image där Java och Jsign redan är installerade:
FROM eclipse-temurin:17-jre
RUN curl -sL https://github.com/ebourg/jsign/releases/download/6.0/jsign-6.0.jar \
-o /usr/local/lib/jsign.jar
ENTRYPOINT ["java", "-jar", "/usr/local/lib/jsign.jar"] Tidsstämpling
Lägg alltid till en RFC 3161-tidsstämpel när du signerar. Kodsigneringscertifikat är giltiga i högst 460 dagar, men tidsstämplade signaturer förblir giltiga även efter att certifikatet har gått ut.
Rekommenderade tidsstämpelservrar
http://timestamp.digicert.com(rekommenderas)http://timestamp.globalsign.com/tsa/r6advanced1
Felsökning
"AccessDeniedException" vid signering
IAM-användaren eller IAM-rollen saknar behörigheten kms:Sign för nyckeln.
Kontrollera IAM-policyn och se till att den pekar på rätt nyckel-ARN.
"InvalidKeyUsageException"
KMS-nyckeln skapades med key usage ENCRYPT_DECRYPT i stället för SIGN_VERIFY.
Skapa en ny nyckel med rätt key usage, eftersom key usage inte kan ändras när nyckeln väl har skapats.
Det går inte att skapa CSR
Kontrollera att IAM-användaren har behörigheten kms:GetPublicKey, att
key spec är RSA_4096 och att regionen stämmer.
Jsign rapporterar "no provider for storetype AWS"
AWS KMS stöds från Jsign 5.0. Ladda ner den senaste versionen från Jsigns webbplats och se till att AWS SDK-beroendena finns på classpath.
Kodsigneringscertifikat
OV Code Signing
DigiCert CodeSign OV
DigiCert OV Code Signing. Fungerar med AWS KMS via Jsign.
GlobalSign CodeSign
GlobalSign OV Code Signing. Fungerar med AWS KMS via Jsign.
EV Code Signing
Vanliga frågor om kodsignering med AWS KMS
Hitta svar på de vanligaste frågorna om SSL-certifikat och FairSSL.
Redo att signera med AWS KMS?
Skapa ett gratis konto och beställ ditt första certifikat. Ett DV-certifikat utfärdas på under 2 minuter.