Short answer: With Play App Signing, Google re-signs your app with its own app signing key. The fingerprint keytool shows for your upload key will "usually not match the one on users' devices". Copy the SHA-256 of the app signing key from Play Console, in colon-separated uppercase hex, into assetlinks.json.
What is happening
sha256_cert_fingerprints: the list of SHA-256 fingerprints of the certificates allowed to sign the app, written as colon-separated uppercase hex strings.
Android compares the fingerprint of the installed app's signing certificate with the list in the file. Google's Play Console help explains two keys:
- Upload key: "You use this key to sign your app bundle before uploading."
- App signing key: "Google uses this key to sign the final APKs delivered to users' devices."
If the file holds only the upload or debug fingerprint, Play-installed apps do not match.
Why does this happen?
Developers usually take the fingerprint from their local keystore with keytool, which is the upload or debug key. With Play App Signing enabled, users receive an app signed with Google's app signing key instead.
Format errors are the other cause:
- SHA-1 instead of SHA-256: a shorter, 20-pair value.
- Lowercase hex: the Digital Asset Links API rejects values that are not "colon-separated uppercase hex".
- No colons or extra spaces. A valid SHA-256 value is 32 uppercase hex pairs joined by 31 colons, 95 characters in total.
How to confirm it
- Open Play Console > Protected with Play > Play Store distribution > Play app signing, and find the App signing key section. Older Google docs call this Release > Setup > App signing.
- Compare that SHA-256 with the value in
https://example.com/.well-known/assetlinks.json. - Compare the value in the live file (
curl -I https://example.com/.well-known/assetlinks.jsonshows the headers; fetch the body without-I) with the app signing key in Play Console. It must be 32 uppercase hex pairs joined by colons, not lowercase and not a shorter SHA-1 value. - On a device with the Play build installed, run
adb shell pm get-app-links com.example.appand check forverified.
How to fix it
- Copy the app signing key's SHA-256 fingerprint from Play Console. Google says the app signing page shows a ready-made Digital Asset Links snippet.
- Add it to
sha256_cert_fingerprints. Keep your upload or debug fingerprint too if you test sideloaded builds, since the field supports several values. - Use uppercase hex with colons between every pair.
- Deploy, then on a test device run
adb shell pm set-app-links --package com.example.app 0 all,adb shell pm verify-app-links --re-verify com.example.app, and after a few minutesadb shell pm get-app-links com.example.app. - Check Play Console > Grow > Deep links, which shows deep links and configuration errors.
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example",
"sha256_cert_fingerprints": [
"14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"
]
}
}]
For local keys, keytool -list -v -keystore my-release-key.keystore prints the fingerprint. The Android App Links setup guide covers the full flow, including Play App Signing.