# Google Play App Signing vs upload key: what is the difference?

SEO title: Google Play App Signing vs Upload Key

Source: https://webnativeapp.com/google-play-app-signing-vs-upload-key

Description: Learn the difference between a Google Play app signing key and upload key, which certificate fingerprint to use, and how to recover a lost upload key.

**The upload key signs the Android App Bundle you send to Google Play. The app signing key signs the APKs that Google Play delivers to users.** With Play App Signing, you keep the upload key while Google protects the app signing key. Losing an upload key is recoverable; losing a self-managed app signing key for an app that is not enrolled can prevent future updates.

The two keys may look similar because both can have a certificate, alias, and SHA fingerprint. They have different jobs and should normally be different. This guide explains which one you need when building an `.aab`, configuring Google or Facebook login, setting up Android App Links, backing up a keystore, or fixing a Play Console signing error. Google documentation checked September 23, 2026.

## App signing key vs upload key at a glance

| Question | App signing key | Upload key |
| --- | --- | --- |
| Who normally holds the private key? | Google Play | You or your build service |
| What does it sign? | APKs delivered to users | The AAB or APK uploaded to Play Console |
| What does Android trust for updates? | The app signing identity | Not the upload identity |
| Which fingerprint usually goes to OAuth, Maps, Firebase, or App Links? | App signing certificate fingerprint for Play-distributed builds | Upload fingerprint only for a build actually signed and installed with that key |
| Can you download the Google-held private key? | No | You already hold it in your keystore or secret manager |
| What happens if it is lost? | Google protects it under Play App Signing; a self-managed key outside the service can be irreplaceable | Create a new key and request an upload-key reset |

Google's [Android app-signing documentation](https://developer.android.com/studio/publish/app-signing) describes a Java keystore as a repository for private keys and certificates. A certificate contains the public key and identifying metadata; it does not contain the private key. That is why sharing a public `.pem` or `.der` certificate with an API provider is different from exposing the `.jks` keystore and its passwords.

## How Play App Signing works

An Android app update must be recognized as coming from the same signing identity as the installed app. With an Android App Bundle, Google Play generates optimized APKs for each device. Play App Signing uses this flow:

1. You build the release `.aab` with the app's stable package name and a higher version code.
2. You sign that bundle locally or in CI with your **upload key**.
3. Play Console verifies the bundle against the registered upload certificate.
4. Google generates the APKs needed for distribution.
5. Google signs those APKs with the **app signing key** before delivering them to users.

Play App Signing is required for new Google Play apps and for publishing with Android App Bundles. Google says all new apps have used the service since August 2021. The separation is intentional: compromise or loss of the replaceable upload key does not expose the app signing key used on users' devices. See [Sign your app](https://developer.android.com/studio/publish/app-signing) and [Upload your app to Play Console](https://developer.android.com/studio/publish/upload-bundle).

### Is Play App Signing the same as signing an AAB?

No. You still sign the AAB before upload. That local signature proves to Play Console that an authorized publisher produced the upload. Google then signs the generated distribution APKs with the separate app signing key. An unsigned bundle or a bundle signed with an unregistered upload key will be rejected.

## What is the app signing key?

The **app signing key** establishes the installed app's identity. Android uses the signature on installed APKs when deciding whether a new version is a valid update. Under the default Play App Signing workflow, Google generates and stores this private key in its key-management infrastructure.

You cannot download the Google-held private app signing key. Play Console does let you view and download its **public certificate**, including SHA-1 and SHA-256 fingerprints. Those public values are safe to give to services that need to identify the Play-distributed app.

Open the app in Play Console and follow the current **Protected with Play → Play Store distribution → Go to Play app signing** path. In the **App signing key** section, you can inspect the certificates and fingerprints Google uses for delivery. Google may show more than one certificate when a signing-key upgrade or its current multi-key signing system applies, so follow the console's instructions for the Android versions and API provider you support. [Use Play App Signing](https://support.google.com/googleplay/android-developer/answer/9842756).

### Should Google generate the app signing key?

For a new app distributed only through Google Play, the default Google-generated key is the straightforward option. It avoids handling the most consequential private key yourself and supports Play's signing-key management.

There is an important cross-store exception. If the same app must use the same signing identity on Google Play and another Android store, decide that strategy before the first release. Google documents options including providing your own app signing key during enrollment or distributing a Google-signed universal APK. Do not upload a private key merely because a setup screen offers the option; choose it only when you understand the cross-store and custody requirements.

## What is the upload key?

The **upload key** is the private key you use to sign release bundles before sending them to Play Console. It is usually stored in a `.jks` or `.keystore` file and selected with an alias. Your build also needs the keystore password and, depending on the file, the key password.

Google stores the corresponding **upload certificate**. When you upload a new AAB, Play Console checks its signature against that certificate. The upload key does not become the signature on the APK delivered through Google Play.

For a new project, Android Studio can create the keystore through **Build → Generate Signed Bundle / APK → Android App Bundle → Create new**. Record the keystore path and alias, then protect the private file and credentials. The official [app-signing guide](https://developer.android.com/studio/publish/app-signing#generate-key) covers each field.

### Can the upload key and app signing key be the same?

They can be in some migration or legacy setups, but Google recommends separate keys. A separate upload key limits the impact of a compromised development or CI environment and gives you a recoverable credential for future uploads without exposing the installed app's signing identity.

## Which SHA-1 or SHA-256 fingerprint should you use?

Use the fingerprint of the certificate that signed the build users will actually install.

| Situation | Fingerprint to register |
| --- | --- |
| Production app installed from Google Play | Play Console **app signing certificate** |
| Internal, closed, or open test installed through Google Play | Play Console app signing certificate used for that delivered build |
| Local debug build | Debug certificate fingerprint |
| Locally installed release build signed with your upload key | Upload certificate fingerprint |
| Android App Links for the Play build | App signing SHA-256 fingerprint in `assetlinks.json` |

This distinction explains a common bug: Google Sign-In or Maps works in a locally installed build, then fails after the app is downloaded from Play. The local build was signed with the upload or debug key, while the Play version was signed by Google with the app signing key. Register the Play app signing fingerprint with the provider and keep the exact same package name.

You can copy the app signing SHA-1 and SHA-256 values from the Play app-signing page. For locally signed variants, Android Studio's Gradle `signingReport` task shows the certificate fingerprints. Register every legitimate build identity your authentication provider needs, without confusing those public fingerprints with private keys.

For verified web links, place the Play app signing SHA-256 fingerprint in your website's `assetlinks.json`. Our [Universal Links and Android App Links guide](https://webnativeapp.com/universal-links-android-app-links-webview-app) shows the full association-file format.

## How to create and store an upload keystore

Create one deliberate production upload keystore for the app rather than generating a new one for every release. In Android Studio:

1. Open **Build → Generate Signed Bundle / APK**.
2. Select **Android App Bundle** and continue.
3. Choose **Create new** next to the keystore path.
4. Select a controlled location, strong passwords, a recognizable alias, and an appropriate validity period.
5. Build the release bundle and upload it through the intended Play Console app.

Store the keystore and credentials separately from the public source repository. Do not commit the `.jks`, `keystore.properties`, passwords, or CI secret values. Restrict who can retrieve them, retain a tested encrypted backup, and document which app and package name they belong to. A backup that nobody can decrypt is not a backup; periodically verify the recovery procedure without exposing the private key.

For CI, keep the keystore in the provider's encrypted file or secret storage and inject passwords through secret variables. Limit secrets to protected release jobs, avoid printing them in logs, and revoke access when a team member or vendor no longer needs to publish. Android's [secure signing configuration](https://developer.android.com/studio/publish/app-signing#secure-shared-keystore) recommends keeping `keystore.properties` out of source control.

### Is the keystore password enough to recover the key?

No. You need the actual keystore file, the correct alias, and the required passwords. Play Console retains the public upload certificate, not a downloadable copy of your upload private key. If the private key is gone, create a new one and request a reset instead of trying to reconstruct it from a fingerprint or certificate.

## What to do if you lose the upload key

If the app is enrolled in Play App Signing, losing the upload key does **not** mean creating a new app listing. Create a replacement upload key and submit its public certificate through Play Console:

1. Generate a new upload keystore in Android Studio.
2. Export only its public certificate in PEM format:

```bash
keytool -export -rfc \
  -keystore upload-keystore.jks \
  -alias upload \
  -file upload_certificate.pem
```

3. In Play Console, open **Protected with Play → Play Store protection → Manage Play app signing**.
4. Find **Upload key certificate**, choose **Request upload key reset**, provide the reason, and upload `upload_certificate.pem`.
5. After Google accepts and activates the new certificate, sign the next AAB with the replacement private upload key.

The PEM file is public; the `.jks` and passwords remain private. Resetting the upload key does not change the app signing key used for installed copies. Follow the live steps in [Google's upload-key reset guide](https://support.google.com/googleplay/android-developer/answer/9842756#reset) because roles and console navigation can change.

If the original app was never enrolled in Play App Signing and its self-managed app signing key is truly lost, the situation is different. Google states that you cannot update that original package with a newly invented signing identity; publishing again may require a new package name and store listing. Confirm the enrollment status before taking action.

## How to fix common signing errors

### “Your Android App Bundle is signed with the wrong key”

The uploaded AAB's certificate does not match the upload certificate registered for that Play Console app. Confirm you selected the correct keystore and alias, especially if your build machine stores keys for several products. Do not replace signing configuration at random. Play Console often shows the expected and detected certificate fingerprints; compare them and rebuild with the registered upload key.

### A Play-installed app cannot use Google Sign-In or another API

Register the **app signing certificate** fingerprint from Play Console with the API provider. Retain the debug or upload fingerprint only for variants signed by those keys. Also verify the provider configuration uses the production package name.

### The AAB cannot update the existing app

An update needs the same package name, a higher version code, and the correct upload signature for Play Console. Google's [update requirements](https://support.google.com/googleplay/android-developer/answer/9859350) show how to compare bundle certificates with `jarsigner`. Do not create a second Play Console app as the first fix.

### The keystore exists but the build says the password or alias is wrong

Verify all four inputs: file path, keystore password, alias, and key password. Copying a `.jks` file does not copy CI variables, and renaming the file does not change the alias inside it. Avoid repeated automated guesses that could leak values into logs; restore the documented release configuration from your password manager or secure build environment.

## Play App Signing FAQ

### Is an upload key the same as an app signing key?

No. The upload key signs the bundle you submit. Google Play verifies it, builds the distribution APKs, and signs those APKs with the app signing key.

### Where is my Google Play app signing key?

Under Play App Signing, Google stores the private key and does not let you download it. Play Console exposes its public certificate and fingerprints under the app-signing section.

### Where is my upload key?

It is in the `.jks` or `.keystore` file created for your build workflow, or in your CI provider's protected signing storage. Play Console has the corresponding public certificate, not a recovery copy of the private key.

### Can Google reset my upload key?

Yes, for an app enrolled in Play App Signing. Generate a replacement, export its public PEM certificate, and request an upload-key reset in Play Console.

### Does resetting the upload key affect existing users?

No. Google continues signing delivered APKs with the app signing key. The replacement upload key changes how Play Console authenticates future uploads, not the installed app's identity.

### Which key signs an AAB?

You sign the AAB with the upload key before sending it to Play Console. Google uses the app signing key on the APKs generated from that bundle for delivery.

### Which fingerprint should Firebase or Google Sign-In use?

For an app installed from Google Play, register the Play **app signing certificate** fingerprint. Add debug or locally signed release fingerprints separately when those builds also need access.

### Should I commit my upload keystore to Git?

No. Keep the keystore, signing properties, and passwords out of public or shared source control. Use protected secret storage and maintain a separate encrypted backup with limited access.

### Is a Google Play service-account key an app-signing key?

No. A service-account JSON credential authenticates software calling the Google Play Developer API. It cannot sign an Android bundle or installed app. See the [Google Play Console service-account guide](https://webnativeapp.com/google-play-console-service-account-key) for that separate workflow.

## Official Google sources

- [Android Developers: Sign your app](https://developer.android.com/studio/publish/app-signing)
- [Play Console Help: Use Play App Signing](https://support.google.com/googleplay/android-developer/answer/9842756)
- [Android Developers: Upload your app to Play Console](https://developer.android.com/studio/publish/upload-bundle)
- [Play Console Help: Update or unpublish your app](https://support.google.com/googleplay/android-developer/answer/9859350)

## Continue your Android release

:::related
- [Create a Google Play Console service account key](https://webnativeapp.com/google-play-console-service-account-key)
- [Universal Links and Android App Links for a WebView app](https://webnativeapp.com/universal-links-android-app-links-webview-app)
- [Google Play submission checklist for web apps](https://webnativeapp.com/google-play-store-submission-checklist-web-apps)
- [Why Google Play rejects WebView apps](https://webnativeapp.com/google-play-webview-app-rejection)
- [Web app to Android](https://webnativeapp.com/web-app-to-android)
- [Convert a web app to Android without Android Studio](https://webnativeapp.com/convert-web-app-to-android-without-android-studio)
:::

## Keep the web product, add the Android release layer

WebNativeApp turns an existing website into an Android app project while you retain the native source code and publishing account. Keep the package name stable, protect the upload keystore, verify the Play app signing fingerprint wherever your APIs need it, and test the signed bundle before production rollout.
