# App Store Connect API -avain (.p8): luonti ja käyttö

> App Store Connect API -avaimen (.p8) voi ladata vain kerran. Rooli, Issuer ID, Key ID, peruutus sekä käyttö Expon, fastlanen tai oman skriptin kanssa.

Alkuperäinen sivu: [App Store Connect API -avain (.p8): luonti ja käyttö](https://devoria.fr/fi/blog/app-store-connect-api-avain-p8-luonti-kaytto)
Kirjoittaja: [Mehdi Azizi](https://devoria.fr/fi/mehdi-azizi)
Julkaistu: 2026-11-04
Sisältö tarkistettu viimeksi: 2026-11-04


App Store Connect API -avaimen avulla työkalu, kuten EAS, fastlane, RevenueCat tai oma skriptisi, voi toimia tililläsi ilman salasanaasi ja kaksivaiheista tunnistautumista. **Apple säilyttää avaimen julkisen puolen, ja sinä lataat yksityisen puolen, `.p8`-tiedoston, vain kerran.** Tällä tiedostolla, Issuer ID:llä ja Key ID:llä allekirjoitat tunnisteita, jotka ovat useimmissa pyynnöissä voimassa enintään 20 minuuttia.

Julkaisen iOS-appini, muun muassa TradaZenin ja Noleran, Expolla. Tiimiavain App Manager -roolilla palvelee RevenueCatia, Expo-buildejani ja komentorivityökalua, jolla muokkaan sovellussivujani. Tämä opas perustuu Applen, Expon ja fastlanen sivuihin, jotka luin uudelleen 3. marraskuuta 2026. Älä sekoita tätä palveluiden avaimiin, jotka päätyvät sovelluksen koodiin: niistä kerrotaan artikkelissa [salainen API-avain Expo-sovelluksessa](https://devoria.fr/fi/blog/salainen-api-avain-expo-sovellus).

## Mitä App Store Connect API -avain tekee

[Applen dokumentaation](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) mukaan App Store Connect API vaatii JWT-tunnisteen jokaiseen pyyntöön. Luot sen ja allekirjoitat sen yksityisellä avaimellasi. Avain toimii vain tämän API:n kanssa: et voi käyttää sitä muissa Applen palveluissa.

Sen hyöty mahtuu yhteen lauseeseen: **kenenkään ei tarvitse hyväksyä kirjautumista.** Apple ID:si törmää kaksivaiheiseen tunnistautumiseen, mikä estää kaiken automatisoinnin. Opas [EAS Submit iOS](https://devoria.fr/fi/blog/eas-submit-ios-expo-sovellus-app-store) näyttää, mitä tämä muuttaa Expo-sovelluksen lähettämisessä.

## Ensin: pyydä pääsy API:in

Ensimmäistä avainta ei voi luoda saman tien. [App Store Connectin ohje](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) on selvä: **Account Holderin on ensin pyydettävä pääsyä API:in.** Hän avaa Users and Access -osion, klikkaa Integrations ja sitten Request Access. Apple käsittelee pyynnön tapauskohtaisesti.

Account Holder on henkilö, joka rekisteröi tilin. Jos olet aloittelija, se olet sinä: opas [Applen kehittäjätili](https://devoria.fr/fi/blog/apple-kehittajatili-hinta-ilmainen) käy rekisteröinnin läpi.

## Tiimiavain vai henkilökohtainen avain

Apple tarjoaa kahta avaintyyppiä. Tässä niiden erot, koottuna [dokumentaatiosta](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) ja [App Store Connectin ohjeesta](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api):

| Kriteeri                         | Tiimiavain               | Henkilökohtainen avain      |
| -------------------------------- | ------------------------ | --------------------------- |
| Kuka voi luoda                   | Account Holder tai Admin | Lähes kuka tahansa          |
| Käytettävissä olevat sovellukset | Kaikki, poikkeuksetta    | Käyttäjän omat              |
| Oikeudet                         | Valittu rooli            | Käyttäjän oikeudet          |
| Avainten määrä                   | Useita                   | Yksi aktiivinen per henkilö |
| Sertifikaatit ja profiilit       | Kyllä, roolin mukaan     | Ei                          |
| Myynti, talous, notaryTool       | Roolin mukaan            | Ei                          |
| Tunnisteen kenttä                | `iss` = Issuer ID        | `sub` = `user`              |

"Lähes kuka tahansa" tarkoittaa Applen mukaan: Account Holder, Admin, App Manager, Customer Support, Developer ja Marketing, ellei Admin tai Account Holder ole poistanut heiltä oikeutta luoda henkilökohtaista avainta.

**Expoa tai fastlanea varten valitse tiimiavain.** Henkilökohtaisella avaimella ei ole pääsyä provisiointirajapintoihin, joilla luodaan sertifikaatteja ja profiileja. [fastlanen dokumentaatio](https://docs.fastlane.tools/app-store-connect-api/) vahvistaa tämän: tiimiavaimet vaaditaan kaikkeen provisiointiin liittyvään.

## Minkä roolin annat avaimelle

Tiimiavain pääsee kaikkiin tilin sovelluksiin roolista riippumatta. Rooli ratkaisee, mitä se voi tehdä. **Apple varoittaa, että Admin-avain voi luoda ja poistaa käyttäjiä**: anna pienin rooli, joka kattaa käyttötarpeesi. Alla olevat oikeudet tulevat [Applen roolitaulukosta](https://developer.apple.com/help/account/access/roles/).

| Avaimen käyttö                             | Roolit, jotka sallivat sen    |
| ------------------------------------------ | ----------------------------- |
| Buildien lähettäminen                      | Admin, App Manager, Developer |
| TestFlight-buildien hallinta               | Admin, App Manager            |
| Sertifikaattien ja profiilien luonti       | Admin, App Manager            |
| Sovelluksen lähettäminen arvioon           | Admin, App Manager            |
| Tuotteiden ja hintojen tuonti (RevenueCat) | Vähintään App Manager         |
| Muiden tiimiavainten luonti                | Admin                         |

RevenueCat-rivi on peräisin [sen dokumentaatiosta](https://www.revenuecat.com/docs/service-credentials/itunesconnect-app-specific-shared-secret/app-store-connect-api-key-configuration). Expon opas taas [antaa avaimelle Admin-roolin](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md). Omissa sovelluksissani App Manager riittää: EAS luo sillä jakeluprofiilit, ja RevenueCat tuo tuotteet.

Kun avain on luotu, [et voi enää muuttaa sen nimeä etkä roolia](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api). Muuttaaksesi niitä sinun on peruttava avain ja luotava uusi.

## Tiimiavaimen luonti vaihe vaiheelta

Tarvitset Admin- tai Account Holder -tilin. [Applen](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) mukaan:

1. **Avaa Users and Access** ja sitten Integrations-välilehti.
2. **Valitse App Store Connect API** vasemmasta sarakkeesta ja sitten Team Keys -välilehti.
3. **Klikkaa Generate API Key** tai +-painiketta.
4. **Anna avaimelle nimi.** Se on vain sinua varten, se ei ole osa avainta. Nimeä se sen työkalun mukaan, joka sitä käyttää.
5. **Valitse rooli** kohdasta Access ja klikkaa Generate.
6. **Lataa yksityinen avain** Download API Key -linkistä.

> Latauslinkki katoaa heti, kun olet ladannut tiedoston, eikä Apple säilytä siitä kopiota. Tallenna `.p8` talteen ennen kuin suljet sivun.

Kirjaa sitten ylös kaksi tunnistetta. [Applen tunnistesivun](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) mukaan **Issuer ID näkyy Integrations-sivun yläosassa** Copy-painikkeen kanssa. Key ID näkyy aktiivisten avainten listassa: vie hiiri sen päälle, niin Copy Key ID tulee näkyviin. Issuer ID on sama kaikille tilin tiimiavaimille. Key ID on avainkohtainen.

Henkilökohtainen avain on nopeampi: avaa käyttäjäprofiilisi, vieritä kohtaan Individual API Key ja klikkaa Generate API Key. Senkin voi ladata vain kerran.

## .p8-tiedoston säilytys

Apple pyytää käsittelemään avainta kuin salasanaa: **älä jaa sitä, älä tallenna sitä koodirepositorioon äläkä koskaan upota sitä sovelluksen koodiin.** Oma rutiinini:

- **Kansio projektin ulkopuolella**, tai jatkuvan integraation työkalusi salaisuuksien hallinta.
- **Avainkansio `.gitignore`-tiedostoon**, jos tiedoston täytyy olla projektissa lähetyksen ajan.
- **Tiukat oikeudet.** Eräs App Store Connectin komentorivityökalu hylkäsi `.p8`-tiedostoni niin kauan kuin muut käyttäjätilit pystyivät lukemaan sen. `chmod 600` ratkaisi ongelman.
- **Yksi avain per työkalu.** Apple antaa [luoda useita avaimia](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) haluamillasi rooleilla.

Viimeistä kohtaa en noudattanut alussa. App Manager -avaimeni palvelee yhtä aikaa RevenueCatia, buildejani ja sovellussivutyökaluani. Jos joudun perumaan sen, kolme työkalua kaatuu kerralla. **Jos aloittaisin alusta, loisin yhden avaimen per työkalu**, jotta voisin katkaista yhden koskematta muihin.

## Käyttö Expon kanssa

Kolme tapaa antaa avain EAS:lle:

- **Anna EAS:n hallita sitä.** `eas credentials --platform ios` voi luoda avaimen ja säilyttää sen Expon palvelimilla. Tämä on yksinkertaisin tie.
- **Määritä se `eas.json`-tiedostossa.** `submit`-profiili hyväksyy kentät `ascApiKeyPath`, `ascApiKeyIssuerId` ja `ascApiKeyId`. [eas.jsonin referenssin](https://docs.expo.dev/eas/json/) mukaan nämä kentät hyväksyvät ympäristömuuttujia, kuten `$ASC_API_KEY_PATH`.
- **Välitä se ympäristömuuttujina.** [EAS CLI:n repositorio](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md) dokumentoi muuttujat `EXPO_ASC_API_KEY_PATH`, `EXPO_ASC_KEY_ID` ja `EXPO_ASC_ISSUER_ID`. Henkilökohtaisella avaimella Issuer ID jätetään pois.

Buildeihin liittyy yksi rajoitus: [Expo täsmentää](https://docs.expo.dev/build-reference/ios-capabilities/), ettei virallinen API osaa liittää App Groupia, Merchant ID:tä tai CloudKit-säiliötä. Silloin tarvitaan kirjautuminen Apple ID:lläsi paikallisesti. Koin tämän Noleran kanssa sen widgetin sovellusryhmän kohdalla: avain otti ominaisuuden käyttöön, mutta ei liittänyt ryhmää. Tein liittämisen Applen kehittäjäportaalissa. **Jos ominaisuuksien synkronointi jumittaa, `EXPO_NO_CAPABILITY_SYNC=1` poistaa sen käytöstä**, ja otat ominaisuuden itse käyttöön sovellustunnisteessa. Buildien allekirjoitus käydään läpi artikkelissa [iOS-sertifikaatti ja provisioning profile](https://devoria.fr/fi/blog/ios-kehittajavarmenne-provisioning-profile-expo).

## Käyttö fastlanen kanssa

[fastlane](https://docs.fastlane.tools/app-store-connect-api/) lukee avaimen JSON-tiedostosta. Kentät `key_id`, `issuer_id` ja `key`, eli `.p8`-tiedoston sisältö, ovat pakollisia. `duration` ja `in_house` ovat valinnaisia. Esimerkkiarvot:

```json
{
  "key_id": "XXXXXXXXXX",
  "issuer_id": "your-issuer-id",
  "key": "-----BEGIN PRIVATE KEY-----\nMIGT...\n-----END PRIVATE KEY-----",
  "duration": 1200,
  "in_house": false
}
```

Välität tämän tiedoston sitten toiminnolle, esimerkiksi `fastlane pilot distribute --api_key_path fastlane/cle.json`. Fastfilessa `app_store_connect_api_key`-toiminto ottaa parametrit `key_id`, `issuer_id` ja `key_filepath`. Istunnon kesto on enintään 1 200 sekuntia eli 20 minuuttia. Kaikki toiminnot eivät tue avainta: fastlane mainitsee esimerkiksi, etteivät `produce` ja `pem` toimi API-avaimella.

## Käyttö omassa skriptissä

Ilman työkalua teet tunnisteen itse. [Apple määrittää reseptin](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests):

- **Otsake**: `alg` on `ES256`, `kid` on Key ID:si, `typ` on `JWT`.
- **Sisältö, tiimiavain**: `iss`, Issuer ID:si; `iat`, luontiaika; `exp`, vanhenemisaika; `aud`, jonka arvo on `appstoreconnect-v1`.
- **Sisältö, henkilökohtainen avain**: `sub` on `user` `iss`:n sijaan.
- **Kesto**: yli 20 minuuttia, niin Apple hylkää tunnisteen useimmissa pyynnöissä.

Pythonilla käytät PyJWT-kirjastoa ja sen kryptografiariippuvuutta, jotka asennetaan [sen dokumentaation](https://pyjwt.readthedocs.io/en/stable/installation.html) mukaan komennolla `pip install pyjwt[crypto]`. Macin päätteessä käytä lainausmerkkejä: `pip install "pyjwt[crypto]"`, muuten zsh ei hyväksy hakasulkeita.

```python
import time
import jwt

KEY_ID = "XXXXXXXXXX"
ISSUER_ID = "your-issuer-id"

with open("AuthKey_XXXXXXXXXX.p8") as f:
    private_key = f.read()

now = int(time.time())
token = jwt.encode(
    {"iss": ISSUER_ID, "iat": now, "exp": now + 20 * 60, "aud": "appstoreconnect-v1"},
    private_key,
    algorithm="ES256",
    headers={"kid": KEY_ID, "typ": "JWT"},
)
print(token)
```

Sitten lähetät sen `Authorization`-otsakkeessa, kuten Applen esimerkissä:

```bash
curl -H "Authorization: Bearer $TOKEN" "https://api.appstoreconnect.apple.com/v1/apps"
```

Ajoin tämän skriptin 3. marraskuuta 2026 kertakäyttöisellä avaimella, jonka loin omalla koneellani: tunnisteen otsake ja sisältö vastaavat Applen sivua, ja ES256-allekirjoitus todentuu. En lähettänyt sitä Applen API:in tällä testiavaimella, koska sitä ei ole olemassa Applella. **Käytä samaa tunnistetta uudelleen niin kauan kuin se on voimassa**: Apple suosittelee tätä paremman suorituskyvyn vuoksi.

## Avaimen peruminen

Peru avain heti, kun se katoaa, vaarantuu tai mikään työkalu ei enää käytä sitä. [App Store Connectin ohjeen](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) mukaan Account Holder- tai Admin-tilillä:

1. Avaa Users and Access ja sitten Integrations.
2. Valitse Team Keys tai Individual Keys ja klikkaa Edit.
3. Valitse perottavat avaimet ja sitten Revoke Key.
4. Vahvista valitsemalla Revoke.

**Perutttua avainta ei voi koskaan aktivoida uudelleen.** [Apple näyttää sen](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 30 päivän ajan kohdassa Revoked. Jokaisen sitä käyttäneen työkalun tunnistautuminen epäonnistuu. Expossa viesti on "[App Store Connect rejected the API authentication credentials](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts)". Tämä viesti ja muut lähetysvirheet selitetään artikkelissa [EAS-lähetyksen virheet ja niiden korjaus](https://devoria.fr/fi/blog/eas-submit-ios-virheet-korjaus). Jos avain ei ole vaarantunut, valmistele uusi ennen kuin katkaiset vanhan. Jos se on vaarantunut, Apple pyytää perumaan sen välittömästi.

Oman henkilökohtaisen avaimesi kohdalla: profiilisi, Individual API Key ja sitten Revoke.

## Oma .p8-avaimen tarkistuslistani

- Account Holder on pyytänyt pääsyä API:in.
- Avain on tiimiavain, jos sitä käytetään buildeihin tai profiileihin.
- Sen rooli on pienin, joka kattaa käytön, ja sen nimi kertoo, mikä työkalu sitä käyttää.
- `.p8` on tallessa repositorion ulkopuolella, tiukoilla oikeuksilla ja salatulla varmuuskopiolla.
- Issuer ID ja Key ID on kirjattu erikseen, ilman tiedostoa.
- Jokaisella työkalulla on oma avaimensa, jotta voit perua vain yhden.

## Automatisoi julkaisu ilman, että avaimesi vuotaa

Avain on vain yksi osa matkaa. [iOS & Android Kit](https://devoria.fr/fi/kits/ios) lähtee liikkeelle appieni pohjakoodista tilauksineen ja kulkee neljä vaihetta App Storeen asti, omaan tahtiisi. Jos kytket RevenueCatin tällä avaimella, koko asennus löytyy artikkelista [RevenueCat ja iOS:n sovelluksen sisäinen tilaus](https://devoria.fr/fi/blog/revenuecat-tilaus-ios-sovellus).

Jos valmistelet ensimmäistä julkaisuasi, [tee ilmainen diagnoosi](https://devoria.fr/fi/diagnostic): se kertoo, mikä sinua oikeasti jarruttaa, ja lähettää sinulle tarkistuslistani Applen hylkäysten välttämiseen. Sivu [sovelluksen julkaiseminen App Storessa](https://devoria.fr/fi/expertise/julkaise-sovellus-app-storeen) käy läpi jokaisen vaiheen sovellussivusta hyväksyntään.

## Usein kysytyt kysymykset

### Miten App Store Connect API -avain luodaan?

Account Holder pyytää ensin pääsyä API:in. Sen jälkeen Admin avaa Users and Access -osion, Integrations-välilehden, App Store Connect API:n ja Team Keys. Hän klikkaa Generate API Key, valitsee nimen ja roolin, luo avaimen ja lataa `.p8`-tiedoston.

### Voiko kadonneen .p8-avaimen ladata uudelleen?

Ei. Tiedoston voi ladata vain kerran, eikä Apple säilytä siitä kopiota. Peru kadonnut avain, luo uusi ja päivitä jokainen työkalu, joka käytti sitä.

### Mistä löydän Issuer ID:n ja Key ID:n?

App Store Connectissa, Users and Access -valikossa, Integrations-välilehdellä. Issuer ID näkyy sivun yläosassa. Key ID löytyy aktiivisten avainten listasta. Henkilökohtainen avain ei käytä Issuer ID:tä.

### Minkä roolin annan Expon käyttämälle avaimelle?

Expon opas antaa Admin-roolin. Applen roolitaulukon mukaan App Manager riittää buildien lähettämiseen sekä sertifikaattien ja profiilien luontiin. Se on oman avaimeni rooli, ja käytän sitä Expo-buildeihini.

### Voiko API-avaimen roolia muuttaa?

Ei. Apple ei salli avaimen nimen eikä roolin muuttamista luonnin jälkeen. Peru avain ja luo uusi oikealla roolilla.

### Vanheneeko App Store Connect API -avain?

Applen sivuilla ei mainita avaimen vanhenemista, ainoastaan sen peruminen. Sillä allekirjoitetut tunnisteet vanhenevat, useimmissa pyynnöissä enintään 20 minuutissa.


## Projektisi

[Review Kit](https://devoria.fr/fi/kits/app-review): App Store -tarkastuksen tarkistuslistani, korjatut Applen hylkäykseni, Google Playn lista ja kolme Claude Code -skilliä. 49 €.

[iOS & Android Kit](https://devoria.fr/fi/kits/ios): Tee iPhone- ja Android-sovelluksesi Claude Codella: sovellusteni pohjakoodi, polku kauppoihin asti ja kaikki kitit. 99 €.

[Diagnoosi: mikä erottaa sinut omasta iPhone-sovelluksestasi](https://devoria.fr/fi/diagnostic): 7 kysymystä, 60 sekuntia: tiedät, mikä oikeasti estää sinua julkaisemasta iPhone-sovellustasi, saat 4 vaiheen polkusi ja sinulle sopivan kitin.
