Skip to content
App Signing & PushOverview
FlutterApp SigningMobile Development

App Signing Explained: Certificates, Keys and Profiles on iOS and Android

How app signing works on iOS and Android: the four building blocks, the six iOS pieces that must agree, Android's keys, and a guide to every post in the series.

By Bimal Khatri·11 min read·Sep 17, 2026·Updated Sep 17, 2026
App Signing Explained: Certificates, Keys and Profiles on iOS and Android

App signing is how a phone knows an app really comes from its developer and has not been changed since. The developer signs every build with a private key that only they hold, and the phone checks that signature before it installs or updates the app.

iPhones and Android phones build on that same idea in different ways. Apple vouches for developers by issuing their certificates, and six separate pieces must agree before an iPhone installs a build. Android has no authority in the middle: developers make their own certificates, and the phone insists that every update carries the same signature as the version already installed.

This page is the map for a series of 45 posts about those keys, certificates and profiles, and the push notification services that rely on them. Start with the mental model below, then jump to the post that matches your problem.

Who this series is for

  • Developers on iOS, Android, Flutter or React Native, including anyone who pasted an error message into a search box and wants the fix.
  • People who are not developers and met a signing message on their own phone. Two posts are written for you, and the others explain things in plain words before the technical detail.

The four building blocks

Every certificate, key file and profile in this series is built from four pieces. Think of signing an official document with a personal stamp.

PieceEveryday versionWhat it really isKeep it secret?
Private keyYour personal stampA secret number that creates signaturesYes, always
Public keyA sample imprint that others compare againstThe matching half, which checks signatures but cannot make themNo
CertificateAn ID card saying whose stamp this isA public key plus a name and an expiry date, signed by an authority (Apple) or, on Android, by yourselfNo
CSR (certificate signing request)The application form for that ID cardYour public key and details, sent to Apple so it can issue a certificateNo

One rule explains a surprising number of errors: a certificate cannot sign anything on its own. Signing also needs the matching private key, and that key exists only on the machine that created the CSR. Download the certificate on a second Mac and Xcode reports a missing private key for exactly this reason.

A map of how signing works. A private key, which stays secret, signs your build to produce a signed app. The phone checks the signature using the public key from the certificate, and if the signature matches, the app installs.

Why iOS checks six things and Android checks two

Android asks two questions of an app: what is its package name, and which key signed it? iOS asks six, and all six must agree before a build will install:

PieceThe question it answersExample
Team IDWho owns this app?A1B2C3D4E5
Bundle IDWhat is the app called internally?com.example.app
App IDHas Apple registered that name, and which capabilities may it use?A1B2C3D4E5.com.example.app, with Push Notifications on
Certificate and private keyWho signed this build?An Apple Distribution certificate for your team
Provisioning profileMay this signed app run here, with these powers?An App Store profile for the app
EntitlementsWhich special powers does the app claim?Push notifications, App Groups, Sign in with Apple

A build installs only when all of these hold:

  1. The app's bundle ID matches the App ID inside the profile.
  2. The signing certificate is listed in the profile.
  3. For development and Ad Hoc builds, the device is listed in the profile.
  4. The profile allows every special power (entitlement) the app asks for.
  5. The certificate and the profile are both still valid: not expired, not revoked.

Most iOS "code signing" errors are one of those five links breaking.

A map of the six iOS pieces. Your team owns an App ID, which is your bundle ID plus its capabilities, and a certificate with its private key. The App ID, the certificate and, for development and Ad Hoc builds, a device list all go into the provisioning profile. The profile and the app's entitlements together produce a signed build that installs only if everything agrees.

The bundle ID is a string you choose and write into the app. The App ID is Apple's record of that string, with your Team ID in front and a list of the capabilities the app may use. Once you upload the first build to App Store Connect, the bundle ID can no longer be changed. Widgets and other extensions are separate bundles, each with its own bundle ID, App ID and profile.

Android's equivalent of the bundle ID is the package name (applicationId in Gradle), which Google Play also treats as permanent. The other half is the signing key, and on Google Play there are usually three of them:

A map of Android's keys. Your app bundle, signed with your upload key, is uploaded to Google Play, which re-signs it with the app signing key before users' phones download it, and every update must match. Separately, a debug build signed with a debug key from your own computer goes straight to your test device.

That is why a debug build, your own release build and the Play Store copy all have different fingerprints, and why a feature tied to one fingerprint can work in testing and fail for real users.

iOS and Android side by side

JobiOSAndroid
The app's permanent identityBundle IDPackage name (applicationId)
Who vouches for the developerApple issues the certificateNobody. Certificates are self-signed; the Play account is the identity, and developer verification adds a registered identity from 2026
Debug signingApple Development certificate and a development profiledebug.keystore
Store signingApple Distribution certificate and an App Store Connect profileUpload key; Google re-signs with the app signing key
Certificate lifetimeTypically one year25 years or more, chosen by you
Limiting which devices can installThe profile's device listNo device list
Special powersEntitlements, granted by the profileManifest permissions, with no signing involved
Push credentialAPNs .p8 keyService account JSON for FCM
Deep link verificationapple-app-site-association (Team ID and bundle ID)assetlinks.json (package name and SHA-256 fingerprint)
Losing the signing credentialRevoke it and create a new certificate. App Store apps keep working while the membership is activeUpload key: Google can reset it. A self-managed app signing key: the app can never be updated again

Every post in the series

Apple files and API keys

Push notifications

Apple certificates

Identifiers and profiles

Team tooling

Android signing

Firebase

For people who are not developers

Where to start

Questions people ask

What is app signing?

A signature made with the developer's private key and attached to the app. The phone checks it before installing, so it can tell whether anyone changed the app and whether an update comes from the same publisher as the installed version.

Is a certificate the same as a private key?

No. A certificate holds the public half plus a name and an expiry date, and it is safe to share. The private key makes the signatures and must stay secret. You need both to sign.

Why does iOS need a provisioning profile when Android does not?

The profile is how Apple limits where an app can run and which special powers it gets: specific devices for test builds, and entitlements such as push. Android has no device list, and its app permissions are declared in the manifest without any signing step.

What is the difference between an upload key and an app signing key?

You sign the file you send to Google Play with the upload key. Google checks it, then signs the copies users download with the app signing key, which Google keeps. A lost upload key can be reset; the app signing key stays with Google.

Do Apple certificates expire?

Yes. In practice, both Apple Development and Apple Distribution certificates are valid for one year. When one expires, apps already on the App Store keep working as long as the membership is active; you create a new certificate to keep shipping.

Is it safe to share my SHA-1 fingerprint?

Yes. A fingerprint is a short hash of a public certificate. Team IDs, Key IDs and bundle IDs are also safe to share.

Which signing files must I keep secret?

.p8 keys, .p12 files and their passwords, .jks and .keystore files, key.properties, and service account JSON files. Never commit them to a repository.

Keep reading

More writing

Keep reading