Application security feature

iOS app attestation

What iOS app attestation proves to your backend: a genuine copy of your app on a real Apple device, fresh for each request, verified on your own server.

  • iOS
Scripted API clients is met at the server-side verdict boundary before it reaches the appScripted API clientsServer-side verdictYour app
  • Proof about the app

    Attestation tells your server that a request comes from your untampered app on a genuine Apple device. It says nothing about who the user is, and it is not meant to.

  • Fresh every time

    Each attestation and assertion is bound to a one-time challenge from your server, so a captured answer cannot be replayed later.

  • Your server decides

    Verification and policy live on your backend. Otukan adds runtime signals so a request from a genuine but instrumented app is still visible.

What iOS attestation helps your backend catch

Pick a threat to see what gets verified, how the request is handled and what your backend records.

Scripts calling your API

  1. Detect

    A script has no Secure Enclave key registered for your App ID, so it cannot produce a valid assertion.

  2. Respond

    Your server refuses or steps up the request, per endpoint.

  3. Report

    The failed verification is logged with the endpoint and session.

Replayed requests

  1. Detect

    Each assertion signs a hash of your server's fresh challenge and carries a counter that must increase.

  2. Respond

    A reused challenge or stale counter is rejected on the server.

  3. Report

    Your backend records the replay attempt against the key it used.

Re-signed or cloned app

  1. Detect

    The attestation binds the key to your team and bundle identifiers, so a copy signed by another team fails verification.

  2. Respond

    Requests from the copy are refused before they reach business logic.

  3. Report

    The mismatch is recorded as an app identity failure.

Genuine app under instrumentation

  1. Detect

    Attestation still passes, so Otukan's runtime checks report hooking, debugging or jailbreak state alongside it.

  2. Respond

    Your server combines both results and restricts the sensitive flow.

  3. Report

    Your backend sees the attestation result and the runtime signal together.

Key farming across installs

  1. Detect

    Your server counts how many keys attest for one account or device context over time.

  2. Respond

    Unusual key churn triggers step-up checks or manual review.

  3. Report

    Key history per account gives your fraud team a trend to act on.

How Otukan strengthens iOS app attestation

Apple's App Attest supplies the cryptographic proof; Otukan makes it usable, observable and harder to misuse.

  • Key and challenge handling

    Manages key generation, attestation and assertion calls in your app, with each request tied to your server's one-time challenge.

  • Verification guidance

    Gives your backend team the checks every attestation and assertion must pass, and the order to run them in.

  • Runtime signals alongside

    Adds jailbreak, hooking and debugger signals, so a genuine app running in a hostile environment is still flagged.

  • Fallback policy

    Defines what each endpoint does when attestation is unavailable, fails or cannot be retried, so legitimate users keep access when a check cannot run.

How it works

  1. Issue a challenge

    Your server sends a random, single-use challenge before a protected call.

  2. Sign in the app

    The app signs the challenge with a key held in the Secure Enclave.

  3. Verify on the server

    Your backend checks the signature, identifiers, counter and challenge before trusting the call.

  4. Combine the signals

    Runtime signals from Otukan travel with the request for a joined decision.

  5. Apply the policy

    Allow, step up or refuse per endpoint, including when attestation is unavailable.

Free for app publishers

Check your app's exposure

A passive review of your published app by an Otukan engineer. No files, no access to your systems. Findings go by email to the verified publisher.

You finish the request on the next page.

iOS app attestation lets your backend verify that a request comes from a genuine, unmodified copy of your app running on a real Apple device, and that the proof is fresh rather than replayed. It builds on Apple’s App Attest: a key created in the Secure Enclave, vouched for by Apple for your team and bundle identifiers, then used to sign a challenge from your server. It does not prove who the user is, and it does not see hooks inside a genuine app. Otukan handles the app side, gives your server the verification checks and adds runtime signals for what attestation cannot see. For the cross-platform view, see mobile app attestation.

Attestation versus user authentication

Teams often reach for attestation to solve a login problem, or for login to solve an app problem. They answer different questions.

QuestionAnswered byExample failure it catches
Is this request from our real app?App attestationA script replaying captured API calls
Is the app running on genuine Apple hardware?App attestationA request forged on a server farm
Is the app being manipulated right now?Otukan runtime signalsA hooked transfer function in the genuine app
Is this the account holder?Authentication, biometrics, step-upA fraudster using stolen credentials in the real app

Treat attestation as a gate on the channel. Keep authentication as the gate on the person. The strongest backends check both on every sensitive flow, and Otukan sends its runtime signals with the same request so the decision is made once, with everything in view.

Challenge freshness and backend verification

Attestation is only as strong as the server that checks it. Two exchanges matter.

First attestation

The app generates a key pair in the Secure Enclave and asks Apple to attest it, hashing in a challenge your server just issued. Your server then verifies the returned object:

  1. The certificate chain leads to Apple’s App Attest root.
  2. The embedded nonce matches your challenge.
  3. The identifier hash matches your team and bundle identifiers.
  4. The environment matches: development keys stay out of production.
  5. The counter starts at zero, and the public key is stored against the install.

Every protected request

Afterwards, the app signs each sensitive request together with a fresh challenge. Your server checks the signature with the stored key, confirms the challenge was issued and not yet used, and confirms the counter has increased. Reject anything that fails, and never accept a challenge twice. A step-by-step reference is in how to verify mobile app attestation.

Key lifecycle, unsupported states and failure policies

Keys do not live forever

An attested key belongs to one install on one device. Deleting the app removes it, and restoring a backup to a new phone does not bring it back. Otukan regenerates and re-attests in those cases, and your server should expect a new key for a known account rather than treat it as fraud by default. Tracking how often an account changes keys turns churn into a useful signal.

When attestation is not available

The simulator does not support App Attest, and some devices and contexts do not either. Apple’s service can also be briefly unreachable. Decide in advance, per endpoint:

SituationLow-risk endpointSensitive endpoint
App Attest not supportedAllow with runtime signalsRequire step-up authentication
Attestation service unreachableAllow and retry laterRetry, then step up
Verification failsAllow read-onlyRefuse and record
Counter or challenge invalidRefuseRefuse and alert

Rolling out to an existing user base

Every install that upgrades to the attesting version generates and attests a new key, and Apple asks developers with large audiences to spread that load rather than switch everyone on at once. Otukan lets you enable attestation for a growing share of users, starting in observe mode where failures are logged but not enforced. Your team watches verification results by app version and device, then turns enforcement on endpoint by endpoint once the numbers look as expected.

Otukan helps your team write this table for your own flows and keeps the app’s behaviour consistent with it, so each failure is handled by design rather than becoming an accidental lockout or an open door. Related controls are covered on iOS app security and in iOS app security guides.

Common questions

  • Does attestation replace login or multi-factor authentication?

    No. Attestation answers which app and which kind of device sent a request. Authentication answers which person is behind it. A genuine app can be operated by a fraudster with stolen credentials, and a real customer can use a scripted client. Your backend needs both answers, and Otukan keeps them separate so each can be enforced on the flows that need it.

  • What happens on devices where App Attest is not available?

    App Attest is not available in the simulator and on some devices and contexts, so your app must check support before relying on it. Otukan helps you define the fallback per endpoint: allow with runtime signals only, require a stronger login step, or refuse. Low-risk reads can stay open while payments and account changes ask for more.

  • Can a jailbroken device still pass attestation?

    It can, because the key lives in the Secure Enclave of genuine hardware and your untouched app can run on a jailbroken phone. That is why Otukan pairs attestation with runtime checks. Your server receives both results and can restrict high-risk flows even when the attestation itself verifies.

  • Does attestation slow down every API call?

    Attestation happens once per key, typically at first launch or after reinstall. After that, each protected request carries a lighter assertion. Otukan lets you attach assertions only to sensitive endpoints such as login, payments and account changes, while routine reads go without them.

On the mobile engineering team?

How protection fits your build, signing and release, platform by platform.

Prove requests come from your real app

Tell us which API calls must come from your genuine app, how your backend handles sessions today and which users sit on devices or contexts without App Attest. We never ask for source code, IPA files, signing keys or production credentials.

Or request a technical demo