Why this happens
When Xcode builds your project to run on a physical device, simulator, or for distribution, it executes the macOS command-line tool /usr/bin/codesign. This utility needs to read the private key associated with your Apple Development or Apple Distribution certificate stored inside your local macOS Keychain.
macOS enforces strict sandboxing around cryptographic private keys. When an external executable like codesign attempts to use a private key for the first time, the operating system intercepts the request and prompts you with codesign wants to access key "..." in your keychain.
This prompt frequently turns into an apparent infinite loop for two main reasons:
- Wrong password type: Developers often mistakenly enter their Apple Account password, an app-specific password, or an organization developer portal password. Keychain Access strictly requires your local Mac login password.
- Stacked dialog boxes: Modern iOS and macOS apps contain multiple embedded frameworks, dynamic libraries (
.dylib), app extensions, and helper tools. Xcode invokescodesignseparately for every single nested component. If you click Allow instead of Always Allow, macOS immediately opens another prompt for the next binary. Because macOS centers these modal dialogs at the exact same screen coordinates, it looks like your password was rejected and the prompt reset, when in reality you are looking at a brand-new prompt for a different framework.
How to fix it
1. Click “Always Allow” across all stacked prompts
The fastest resolution requires clearing all pending signing requests while granting permanent access to codesign.
- When the dialog appears asking for your keychain password, type your Mac user account password (the one you use to unlock your Mac upon reboot).
- Click Always Allow instead of Allow or pressing Return (which defaults to “Allow”).
- If the prompt reappears immediately, do not panic or assume the password failed. Enter your Mac password again and click Always Allow.
- Repeat this process until every stacked prompt finishes. Depending on the number of third-party libraries (CocoaPods, Swift Packages, Carthage) in your project, you may need to click it between three and ten times.
Once completed, macOS records codesign on the private key’s access control list, and subsequent builds will sign automatically without prompting.
2. Update Access Control permissions in Keychain Access
If the prompt returns on every single build despite clicking “Always Allow”, your keychain entry may have corrupted or read-only access control settings.
- Close Xcode completely (
Cmd + Q). - Open the Keychain Access app on your Mac (located in
/System/Applications/Utilities/Keychain Access.app). - In the sidebar, select the login keychain under Default Keychains.
- Click the Keys or Certificates tab.
- Locate your active developer certificate (such as
Apple Development: Your Name (...)orApple Distribution: Your Team (...)). - Click the disclosure arrow next to the certificate to reveal the associated Private Key.
- Double-click the private key to open its settings window, then select the Access Control tab.
- Verify whether Confirm before allowing access is checked. Look at the list of applications allowed to use the key.
- Click the + (plus) icon, press
Cmd + Shift + Gto open the path field, and enter:
text
/usr/bin/codesign - Add
codesignto the list, click Save Changes, and enter your Mac login password when prompted.
Alternatively, for local development machines where security policies permit, you can select Allow all applications to access this item. This permanently suppresses all keychain confirmation dialogs for that specific private key.
3. Unlock and relink the login keychain via Terminal
If Keychain Access has a stale lock status or fails to persist permissions after a macOS password change, you can explicitly unlock and refresh your keychain session using the security command line tool.
Open Terminal and run:
security unlock-keychain ~/Library/Keychains/login.keychain-db
Terminal will prompt you for your password:
password to unlock default:
Type your Mac user password and press Enter. Note that Terminal will not display characters or asterisks while you type.
To ensure the keychain does not lock automatically in the middle of long compilation runs, configure its lock timeout:
security set-keychain-settings -lut 7200 ~/Library/Keychains/login.keychain-db
This command keeps your login keychain unlocked for two hours (7200 seconds) of active development.
4. Re-import or recreate your development certificate
If the private key in your keychain lacks write permissions or was imported with a broken partition list, Xcode will never be able to bind access rights to it.
- Open Keychain Access.
- Locate the offending certificate and private key under login.
- Right-click both items and select Delete.
- Launch Xcode and navigate to Settings (
Cmd + ,) > Accounts. - Select your Apple ID / Developer Team and click Manage Certificates….
- Click the + icon in the bottom-left corner and choose Apple Development.
- Xcode will generate a fresh public-private key pair and configure appropriate default access permissions automatically.
How to prevent it
- Always click “Always Allow”: Never click “Allow” or tap the Return key when prompted by
codesign. Only “Always Allow” writes the exception to the access control list. - Keep login and keychain passwords in sync: If you change your macOS account password, update your login keychain password immediately in Keychain Access settings so your keys unlock on boot.
- Use automatic signing in Xcode: Let Xcode manage signing certificates through Signing & Capabilities > Automatically manage signing rather than manually dragging keys between Macs.
- Export identities with passwords: When transferring certificates across development machines, export them as password-protected
.p12files and import them directly into theloginkeychain, not theSystemkeychain.
FAQ
Which password does the codesign prompt actually require?
It requires your local Mac user account password—the exact password you enter on your Mac’s lock screen. It does not accept your Apple Account (Apple ID) password, developer portal password, or device passcode.
Why does the prompt keep reappearing after I enter the correct password?
Xcode signs every framework, library, and bundle inside your app individually. When you have several embedded dependencies, macOS generates multiple identical dialogs stacked directly over each other, creating the illusion of a single recurring prompt.
Is it safe to choose “Allow all applications to access this item”?
On a dedicated personal development Mac, selecting this option for your local development private key is generally safe and eliminates recurring prompts. However, you should avoid using this setting for production App Store distribution keys on shared team workstations or continuous integration runners.
Parts of this guide are adapted from content licensed under CC BY-SA 4.0; this article is shared under the same license.
