- Key Takeaways
- Vad är uppladdningsnyckel?
- Varför använda uppladdningsnyckel?
- Men hur skapar vi en uppladdningsnyckel?
- Men vad är nyckelanvändningstillägg?
- Hur många nyckelanvändningstillägg finns tillgängliga, och vilket ska jag välja?
- Hur lägger jag nu till KU- och EKU-tillägg i mitt certifikat?
- Vanliga frågor om partihandel med mat och dryck
- Slutsats
I den moderna världen används Google Play-appen flitigt av utvecklare för att publicera sina appar med Google Android. Men när det gäller att publicera den måste man ha några nyanser i åtanke för bättre säkerhet. En sådan är ett självsignerat certifikat.
Självsignerade certifikat används generellt sett inte i TLS-världen (förutom för teständamål). Däremot används de fortfarande inom samdesign. Särskilt i Android-världen, där den självsignerade nyckeln används för "uppladdningsnyckeln". Låt oss utforska hur vi genererar "uppladdningsnyckeln" på ett säkert sätt, men innan den...
Varför ett standardkodsigneringscertifikat misslyckas för Play-appsignering: Google Play kräver att uppladdningsnyckelcertifikatet innehåller specifika tillägg för nyckelanvändning (digital signatur) och utökad nyckelanvändning (kodsignering), enligt RFC 5280. Ett självsignerat certifikat som genereras utan att dessa tillägg explicit anges avvisas av Play Console trots att det är kryptografiskt giltigt. Lösningen är att lägga till tilläggen vid genereringstillfället och inte byta certifikattyp.
Key Takeaways
- Play App Signing använder två separata nycklar: uppladdningsnyckeln (självsignerad, används endast för att autentisera din uppladdning till Google) och appsigneringsnyckeln (som Google hanterar och använder för att faktiskt signera den distribuerade APK-filen). Det här inlägget behandlar endast uppladdningsnyckeln.
- Att använda en separat uppladdningsnyckel istället för att återanvända din appsigneringsnyckel begränsar läckagets explosionsradie: en komprometterad uppladdningsnyckel kan inte användas för att förfalska APK-filer som utger sig för att vara din app, eftersom Googles egen signeringsnyckel är det som faktiskt är viktigt för distributionen.
- För de allmänna certifikat- och PKCS#11/HSM-koncept som refereras här, se Kodsignering 101: Lås ner din programvaruleveranskedja.
Vad är uppladdningsnyckel?
Uppladdningsnyckeln är den nya metoden för att ladda upp APK:er (Android Package Kit) till Google Play App Signing för publicering till användare. Uppladdningsnyckeln skapar förtroende mellan ditt företag och Google för att ladda upp ett Android-paket. Android-paketet måste signeras med uppladdningsnyckeln innan det laddas upp till Play Console. Det är helt annorlunda än den appsigneringsnyckel som används för att signera Android-paketet för distribution.
Därför använder Play App Signing två nycklar: appsigneringsnyckeln och uppladdningsnyckeln. Vi kommer endast att referera till uppladdningsnyckeln i den här artikeln.
Nedan följer en figur som illustrerar signeringsflödet i Android:

Varför använda uppladdningsnyckel?
Om du fortsätter att använda din appsigneringsnyckel för dina utgåvor riskerar du att nyckeln läcker på grund av mänskliga fel. Anta dock att du använder en separat uppladdningsnyckel för att signera de binärfiler du producerar på din dator.
I så fall, även om uppladdningsnyckeln är komprometterad, kan den inte användas av en illvillig tredje part för att skapa APK-filer som utger sig för att vara din egen. Därför anses det vara bästa praxis att använda en separat uppladdningsnyckel.

Använd alltid alternativet "Exportera och ladda upp en nyckel från Java Keystore" ur säkerhetssynpunkt.
Men hur skapar vi en uppladdningsnyckel?
Självsignerade certifikat används för att generera en uppladdningsnyckel. Vi kommer först att diskutera det förenklade sättet som vanligtvis används för att skapa en självsignerad nyckel via OpenSSL och senare diskutera bristen och lösningen bakom denna metod:
Ett enkelt sätt att skapa en självsignerad nyckel via OpenSSL
Generering av privat nyckel
Först skapar vi en privat nyckel. Kommandot nedan skapar en 4096-bitars RSA privat nyckel (.key) med OpenSSL-kommandot:
openssl genrsa -out upload.key 4096

Om vi vill att den privata nyckeln ska krypteras, lägg till alternativet -des3 i kommandot.
openssl genrsa -des3 -out upload.key 4096

Om den privata nyckeln är krypterad, observera att alla automatiserade byggen eller CI/CD-pipelines som signerar uppladdningen kommer att behöva lösenfrasen som anges vid signeringstillfället, eftersom det inte finns någon interaktiv prompt i det sammanhanget. Väg den operativa kostnaden mot säkerhetsfördelen innan du krypterar nyckeln för ett automatiserat arbetsflöde.
Skapa en begäran om certifikatsignering
Du behöver en certifikatsigneringsförfrågan (CSR) om du vill att ditt certifikat ska signeras. CSR:n innehåller din publika nyckel och ytterligare information (organisation, land etc.)
Låt oss skapa en CSR (upload.csr) från vår befintliga privata nyckel:
openssl req -key upload.key -new -out upload.csr


Hämtar certifikat från CSR och genererar nyckel
När CSR och privat nyckel har genererats är nästa steg att skapa certifikatet. Kommandot nedan genererar certifikatet med 365 dagars giltighet:
openssl x509 -req -days 365 -in upload.csr -signkey upload.key -out upload.crt

Det mottagna certifikatet är i .crt-format, utan privat nyckel, och vi vill ha ett .pfx-format (eftersom det innehåller en privat nyckel) för att signera filer. Vi använder kommandot nedan för att konvertera det till pfx:
openssl pkcs12 -inkey upload.key -in upload.crt -export -out upload.pfx
När lösenordet har angetts genereras en .pfx-fil.

Denna pfx-fil ska sedan signera Android-paketet.
Låter bra, eller hur? Filer som signerats via detta certifikat accepteras dock inte i Playstore. Detta beror på att det självsignerade certifikatet inte innehåller tilläggen Key Usage och Enhanced Key Usage. För att se detta, öppna Certifikat i MMC (Microsoft Management Console) och ladda snapin-modulen Certifikat. När du har öppnat certifikatet klickar du på fliken Detaljer.

Men vad är nyckelanvändningstillägg?
Nyckelanvändningstillägg (KU) definierar syftet med den publika nyckeln i ett certifikat. En enda nyckel bör endast användas för ett syfte.
Hur många nyckelanvändningstillägg finns tillgängliga, och vilket ska jag välja?
Enligt RFC 5280 (Key Usage) finns följande nyckelanvändningstillägg tillgängliga:
- Digital signatur
- Icke förkastande
- Nyckelkryptering
- Datakryptering
- Viktigt avtal
- Certifikatssignering
- CRL-signering
- Endast kryptering
- Endast dechiffrera
På samma sätt måste följande värden väljas för utökad nyckelanvändning (EKU), beroende på användningsfall:
| Utökad nyckel | Aktivera för dessa nyckelanvändningstillägg |
|---|---|
| TLS-webbserverautentisering | Digital signatur, nyckelkryptering eller nyckelavtal |
| TLS Web-klientautentisering | Digital signatur och/eller nyckelavtal |
| Signera (nedladdningsbar) körbar kod | Digital signatur |
| E -postskydd | Digital signatur, oavvislighet och/eller nyckelkryptering eller nyckelavtal |
| IPSEC-slutsystem (värd eller router) | Digital signatur och/eller nyckelkryptering eller nyckelavtal |
| IPSEC-tunneln | Digital signatur och/eller nyckelkryptering eller nyckelavtal |
| IPSEC-användare | Digital signatur och/eller nyckelkryptering eller nyckelavtal |
| Tidsstämpling | Digital signatur, oavvislig. |
Därför kräver vi, för användningsfall av kodsignering, digital signatur som nyckelanvändning och kodsignering som utökad nyckelanvändning.

Hur lägger jag nu till KU- och EKU-tillägg i mitt certifikat?
För att lägga till dem måste vi köra följande kommando i OpenSSL:
openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out server.pem -days 365 -subj /CN=Cert_Name/C=US/OU=Din_OU/O=Ditt_org_namn -addext “keyUsage = digitalSignature” -addext “extendedKeyUsage = Kodsignering”
Var:
CN = Certifikatets vanliga namn (vanligtvis organisationsnamn vid kodsignering)
C= Landsnamn
OU = Organisationsenhet (t.ex. teknik, IT, etc.)
O= Organisationsnamn

Och detta genererar det nödvändiga kodsigneringscertifikatet med tillägget Nyckelanvändning och Utökad Nyckelanvändning.

Det här certifikatet kan nu användas för att ladda upp Android-paketet till Google Play App Signing Console.
Vanliga frågor om partihandel med mat och dryck
Är mitt befintliga företagskodsigneringscertifikat fel verktyg för detta, eller saknas det bara ett tillägg?
Saknar bara ett tillägg. Play Console avvisar certifikatet eftersom det saknar tilläggen för digital signaturnyckelanvändning och utökad nyckelanvändning för kodsignering, inte för att det är fel certifikattyp. Återskapas med rätt. -addext flaggor löser det.
Måste uppladdningsnyckeln vara samma nyckel som signerar den slutgiltiga distribuerade APK-filen?
Nej. Under Play App Signing lagrar och använder Google den separata appsigneringsnyckeln för att signera det som faktiskt når användarna. Uppladdningsnyckeln verifierar bara att paketet du skickar in kommer från dig.
Vad händer om min uppladdningsnyckel är komprometterad?
Google tillhandahåller en process för att återställa uppladdningsnyckeln som är kopplad till din app, eftersom Google, inte du, kontrollerar den faktiska appsigneringsnyckeln som används för distribution. Det är just den här fördelen med att hålla de två nycklarna separata.
Slutsats
Lösningen här är inte ett annat certifikat, utan rätt tillägg på det du redan vet hur man genererar. Ställ in digital signatur som nyckelanvändning och kodsignering som utökad nyckelanvändning vid genereringstillfället, så fungerar samma OpenSSL-baserade arbetsflöde för uppladdning av nyckel för Play-appsignering.
- Key Takeaways
- Vad är uppladdningsnyckel?
- Varför använda uppladdningsnyckel?
- Men hur skapar vi en uppladdningsnyckel?
- Men vad är nyckelanvändningstillägg?
- Hur många nyckelanvändningstillägg finns tillgängliga, och vilket ska jag välja?
- Hur lägger jag nu till KU- och EKU-tillägg i mitt certifikat?
- Vanliga frågor om partihandel med mat och dryck
- Slutsats
