Do not run match nuke or rebuild certificates first. In 2026, your recovery path should be: verify match repository access and decryption, confirm the complete signing identity in Keychain, check Provisioning Profile mapping and entitlements, then review CI readonly behavior before rotating anything.

This guide is for you if you run fastlane match on a remote Mac and an Archive suddenly reports a missing signing identity. It also fits small teams whose local build works while an unattended CI job fails, and developers moving manual certificate handling into shared signing asset management.

This week’s action: preserve a sanitized failed log, record the exact Archive command and active Xcode selection, then reproduce the failure with the same commit before changing certificates or profiles.

The failure timeline

A signing failure is easier to repair when you identify the first broken layer instead of reacting to the last error message. A line such as No signing certificate can describe a missing private key, an inaccessible Keychain, an incorrect target mapping, or a CI process that cannot read the installed identity.

Use this decision path:

  • Repository or decryption layer: match cannot clone, authenticate, select the expected branch, or decrypt the signing repository.
  • Installation layer: the certificate or profile was retrieved, but the expected private key or Keychain identity is unavailable to the build process.
  • Project mapping layer: the identity exists, but the target selects the wrong Bundle ID, profile, Team, certificate, or entitlement set.
  • Post-signing validation layer: the Archive is signed, but export or upload rejects the result because the signature, profile, entitlement, or distribution method does not match.

Keep the following evidence before making changes:

  • The sanitized match and xcodebuild output.
  • The process exit status.
  • The selected Xcode path and build configuration.
  • The Scheme and destination used by the failing job.
  • The target-level signing settings and export options.
  • The Keychain name used by the CI process.
  • The profile UUID, name, application identifier, Team identifier, and expiration state, with secrets removed.

Do not place repository tokens, deployment keys, storage credentials, MATCH_PASSWORD, certificate passwords, or private keys in a copied log. Replace them with values such as <SIGNING_REPO_URL>, <MATCH_PASSWORD>, <TEAM_ID>, and <BUNDLE_ID>.

The fastlane code signing troubleshooting guide treats the certificate, private key, profile, and build settings as separate diagnostic areas. That separation matters on a remote Mac because an interactive desktop session and an unattended shell can see different Keychains and permissions.

Repository access versus asset decryption

A source repository and a signing repository are separate trust boundaries. Your source checkout can succeed while match fails because the signing repository uses another deploy key, a different token scope, another object-storage credential, a protected branch, or a different encryption password.

The official match documentation describes storage options and the encrypted signing asset workflow. Use its current parameters as the reference for your chosen storage mode. Do not assume that a command copied from an older pipeline still reflects the behavior of the installed fastlane version.

What should you check when fastlane match cannot find a signing certificate?

First determine whether the certificate is absent from the encrypted store or simply unavailable after installation. Run the repository and decryption checks independently, using placeholders in any command shared with another person:

bundle exec fastlane match appstore \
  --git_url "<SIGNING_REPO_URL>" \
  --git_branch "<SIGNING_BRANCH>" \
  --readonly

If your team uses another storage mode, validate that provider’s credential separately rather than testing only the full build. Confirm all of the following:

  • The CI identity can authenticate to the signing store.
  • The requested branch or storage path exists.
  • The Team configuration points to the intended Apple Developer account.
  • The encryption password is supplied to the job without appearing in command output.
  • The requested lane and distribution type match the stored assets.
  • The CI environment has the same MATCH_PASSWORD value expected by the repository.

A successful source checkout proves only that the source credential works. It says nothing about signing-store access. Treat repository authentication, encryption, Apple account authentication, and upload authentication as four different credentials.

If the encrypted store is reachable but decryption fails, do not delete the repository or generate new certificates. Check the secret injection method, whitespace handling, shell quoting, and the credential scope of the CI runner. A password mismatch is not evidence that the certificate itself has expired.

Certificate file, private key, and signing identity

A certificate file alone is not a usable code-signing identity. The build needs the certificate and its matching private key in an accessible Keychain. Apple’s distribution guidance explains how signing identities connect the certificate, private key, provisioning profile, and application target; use the Apple distribution documentation when verifying the expected signing flow.

Inspect the intended Keychain rather than relying on the graphical Keychain Access app:

security find-identity -v -p codesigning "<KEYCHAIN_PATH>"
security list-keychains -d user
security show-keychain-info "<KEYCHAIN_PATH>"

Use <KEYCHAIN_PATH> as a placeholder. Do not publish a real home-directory path if it contains usernames, workspace identifiers, or customer information.

The result should contain a valid identity that pairs the expected distribution certificate with its private key. A certificate visible in Keychain Access but missing from security find-identity usually points to a missing private key, an invalid pairing, an inaccessible Keychain, or a trust and usability problem. The exact diagnostic interpretation can vary with the installed macOS and Xcode combination, so record those versions before comparing another machine.

How do you recover a Keychain that will not unlock after a remote Mac restart?

Start by identifying which Keychain the failing process uses. A desktop login may unlock a user Keychain automatically, while a launch agent, SSH session, or CI worker may run with another session context. Confirm the build user, Keychain search list, lock state, and unlock mechanism used by the runner.

Then validate the recovery path in a controlled maintenance window:

  • Confirm the Keychain exists after the restart.
  • Confirm the CI user owns or can access the Keychain.
  • Unlock only the intended Keychain for the build process.
  • Recheck the signing identity from the same shell context used by CI.
  • Run a small signing or Archive validation task.
  • Lock the Keychain again if your security policy requires it.

Do not make “allow all applications to access this item” the default repair. Do not permanently disable Keychain protections merely to make an unattended build pass. A working build with unrestricted private-key access can create a larger incident than the original signing failure.

Also avoid treating a permanent interactive login as infrastructure. If the remote Mac must survive a restart, document how the build user, Keychain, secrets, and runner service recover without a person opening Xcode. You can use the iOS certificate migration acceptance guide as a related planning reference when moving signing assets between machines.

Profile mapping and target entitlements

A Provisioning Profile is not interchangeable across targets. Its application identifier, Team, profile type, linked certificate, and entitlements must fit the target being archived. Apple’s explanation of the internal structure of Provisioning Profiles is the right source for inspecting these relationships.

Inspect the profile installed by match and compare it with the target settings:

security cms -D -i "<PROFILE_PATH>" > "<PROFILE_PLIST>"
/usr/libexec/PlistBuddy -c "Print :Entitlements" "<PROFILE_PLIST>"

Use a real profile path only inside the secured build environment. Keep the example path as a placeholder in documentation.

Check these fields:

  • Bundle ID and application identifier.
  • Team identifier.
  • Development, ad hoc, app store, or other intended profile type.
  • Developer certificate or distribution certificate association.
  • Push notification, associated domains, app groups, keychain access groups, and other required entitlements.
  • Expiration and validity state.
  • Target-specific profile selection in the project and export options.

How should several Bundle IDs be handled in fastlane match?

Treat each Bundle ID as an explicit signing relationship, not as an accidental side effect of one shared profile. A main application, notification extension, share extension, watch component, and companion target may each require its own identifier and profile. List every target in the match configuration and verify that the lane requests the intended distribution type.

A common mapping failure occurs when a shared signing repository contains assets for multiple applications, but the project’s automatic signing settings select a profile belonging to another target. Another occurs when the main app is updated while an extension still uses an old entitlement set. The repository can be healthy even though the project mapping is wrong.

If a profile is missing, distinguish among these cases:

  • match did not retrieve it because the identifier was not requested.
  • match retrieved it but the CI process cannot read the installed file.
  • The profile exists but is expired or invalid.
  • Xcode selected another profile through automatic signing.
  • The profile does not contain the entitlement required by the target.
  • The export options request a distribution method that does not match the Archive.

The Apple profile management documentation explains when profiles can be edited, downloaded, or deleted. Use that process to confirm the Apple-side state before replacing a working local asset.

Local Xcode versus remote Archive

A local success does not prove that the remote environment is equivalent. Automatic signing in Xcode can repair or select assets interactively. A command-line Archive on a remote Mac may use another Xcode installation, Scheme, configuration, user, Keychain, profile path, or export options file.

Compare the two environments rather than changing the project immediately:

xcode-select -p
xcodebuild -version
security list-keychains -d user

Record the values from both machines. Do not turn a version difference into a universal compatibility claim; behavior depends on the installed Xcode, macOS, fastlane, project settings, and runner context.

Your recovery timeline should be:

  • Check out the same commit locally and remotely.
  • Select the intended Xcode explicitly.
  • Run match before the build action.
  • Use the same Scheme and configuration.
  • Use the same Archive command.
  • Use the same export destination and options.
  • Compare the resulting signing identity and profile selection.
  • Run the export or upload validation only after Archive succeeds.

The fastlane continuous integration guidance recommends separating CI credentials and preparing the machine for unattended execution. This is especially important with readonly. A read-only match run can install existing assets, but it does not act as an administrator that creates or updates a missing certificate or profile.

What does readonly change when the profile is missing?

readonly prevents the lane from creating or modifying signing assets. If the requested Provisioning Profile is not already available in the signing store or cannot be installed, the job should fail rather than silently repair the account. That is useful for CI reproducibility, but it means an administrator must complete the asset update through a controlled process before the next build.

Do not remove readonly inside a production pipeline as a quick fix. First decide whether the missing asset is expected, whether the Apple account has permission to create it, and whether the change affects another application or release lane.

For additional infrastructure checks, see this remote Mac CI environment acceptance guide. It is most relevant when a machine reset, Keychain loss, or interrupted runner repeatedly recreates the same failure.

Repair, rotation, or controlled rebuild

Choose the least destructive action that explains the evidence.

Repair in place when the repository credential, decryption secret, branch, Keychain selection, profile mapping, or build setting is wrong. These changes preserve the existing certificate and profile relationships.

Rotate under control when a certificate or profile is expired, revoked, no longer authorized, or affected by a confirmed Team or entitlement change. Record which applications, extensions, environments, and release lanes depend on the asset before creating its replacement.

Rebuild only after confirmation when the asset cannot be recovered and its impact is understood. A rebuild can affect development, ad hoc distribution, App Store distribution, extensions, external testers, and unattended release jobs.

Does an expired certificate automatically require match nuke?

No. Expiration alone does not justify destroying every managed certificate and profile. Check whether the required distribution asset can be renewed or replaced without affecting unrelated applications. Review the official match nuke documentation before considering it, because the operation is designed to revoke and remove managed signing assets and can interrupt more than the failing lane.

Before any destructive operation, create an inventory containing:

  • Application and extension Bundle IDs.
  • Team and distribution types.
  • Current certificate names and expiration states.
  • Profile names and target mappings.
  • Archive and export lanes.
  • TestFlight or App Store release dependencies.
  • CI jobs that use each asset.
  • A recovery owner and rollback plan.

After repair or rotation, perform a non-urgent Archive, export it with the intended method, inspect the signed product, and stop before upload if the entitlements or profile are wrong. The objective is not merely to make match exit successfully. The objective is to prove that the complete signing chain works in the same unattended context used for release.

The recovery decision matrix

Use this comparison before changing assets. It separates a configuration repair from a certificate operation and keeps the most destructive action as the final option.

Observed condition First action Asset action CI decision Recovery evidence
Signing repository cannot authenticate Validate the signing-store credential and branch Do not rotate Keep readonly enabled match reaches the expected encrypted assets
Decryption fails Verify the injected password and secret formatting Do not delete the store Keep the existing pipeline unchanged Assets decrypt without exposing secrets
Certificate is present but identity is absent Import or restore the matching private key into the intended Keychain Repair the Keychain path or identity Run the same shell context as CI security find-identity shows the usable identity
Profile does not match the target Compare Bundle ID, Team, type, certificate, and entitlements Update the specific mapping or profile Do not disable readonly blindly Archive uses the expected profile
Profile or certificate is confirmed invalid Inventory dependencies first Controlled rotation Update the store, then return CI to read-only mode Archive and export succeed after rotation
Assets are unrecoverable and impact is documented Obtain approval and backup records Consider a controlled rebuild or match nuke Recreate only required lanes A clean Archive and export pass before release

Final Archive milestone

A remote Mac is ready for signing work only when the complete path survives outside an interactive Xcode session. The final milestone should include the same commit, the same Scheme, the same configuration, the same match mode, the same Keychain path, and the same export options used by the release job.

Run these checks in order:

  • Confirm the runner starts under the intended build user.
  • Confirm the Keychain remains present and can be unlocked after a restart.
  • Confirm match retrieves or installs the expected assets.
  • Confirm the complete Apple Distribution identity is visible to the process.
  • Confirm every target maps to the intended Provisioning Profile.
  • Confirm required entitlements match the profile.
  • Confirm Archive succeeds without automatic signing repair.
  • Confirm export validation succeeds before any production upload.
  • Restore CI to its intended readonly policy.

If the failure began after a temporary machine reset, a disposable workspace, or interrupted credentials, a persistent remote Mac can be a better fit than repeatedly rebuilding the environment on demand. A local machine may still be the right choice for long-running workloads, physical-device testing, or teams that need direct hardware access. A generic cloud runner can be cheaper for fully supported non-macOS jobs, but it cannot replace a persistent macOS signing environment when Keychain state and Xcode tooling must remain available.

For an independent developer, the current setup often has three concrete weaknesses: certificates are tied to one personal machine, a restart breaks the unattended Keychain path, and every release depends on manual recovery. Renting a remote Mac through VMSPIN gives you a place to reproduce the signing chain with a persistent machine rather than treating every failed Archive as a new migration. Use a non-urgent release branch as the acceptance test: after a restart, match should restore the intended assets and the same remote Mac should complete Archive and export without destructive commands.