{"record":{"id":"56a1a40e9c3929f5","repo":"nikivdev/code","slug":"security-find-identity-failed","errorCode":null,"errorMessage":"`security find-identity` failed","messagePattern":"`security find-identity` failed","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/release_signing.rs","lineNumber":109,"sourceCode":"            println!(\"Env store: unable to read signing keys ({})\", err);\n            println!(\"Next: run `f env login` (cloud) and `f env unlock` (Touch ID), then retry.\");\n        }\n    }\n\n    println!();\n    println!(\n        \"GitHub: `f release signing sync` will copy env store values into GitHub Actions secrets via `gh`.\"\n    );\n    Ok(())\n}\n\nfn list_codesign_identities() -> Result<Vec<String>> {\n    let output = Command::new(\"security\")\n        .args([\"find-identity\", \"-v\", \"-p\", \"codesigning\"])\n        .output()\n        .context(\"failed to run `security find-identity`\")?;\n    if !output.status.success() {\n        bail!(\"`security find-identity` failed\");\n    }\n    let text = String::from_utf8_lossy(&output.stdout);\n    let mut out = Vec::new();\n    for line in text.lines() {\n        // Example:\n        //  1) <hash> \"Developer ID Application: Name (TEAMID)\"\n        let Some(quoted) = line.split('\"').nth(1) else {\n            continue;\n        };\n        let name = quoted.trim();\n        if !name.is_empty() {\n            out.push(name.to_string());\n        }\n    }\n    Ok(out)\n}\n\nfn store(opts: ReleaseSigningStoreOpts) -> Result<()> {","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/nikivdev/code/blob/a747e741ae92c09071d0ae946ab48488adcff1ce/src/release_signing.rs#L91-L127","documentation":"list_codesign_identities shells out to macOS `security find-identity -v -p codesigning` and bails when the command exits non-zero. It means the keychain query itself failed, not that no identities exist (zero identities would parse to an empty list).","triggerScenarios":"`security find-identity -v -p codesigning` returns a non-zero exit status while listing identities inside release signing `status`.","commonSituations":"Corrupted or locked keychain; missing codesigning policy support; `security` binary failing due to permissions (e.g. running in CI without a user keychain).","solutions":["Unlock the keychain: `security unlock-keychain ~/Library/Keychains/login.keychain-db`","Run `security find-identity -v -p codesigning` manually to see the underlying error","Verify a login/default keychain exists (`security list-keychains`)","On CI, create/import a temporary keychain before calling `f release signing status`"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// pre-check: security binary works and a keychain exists\nsecurity list-keychains > /dev/null 2>&1 || echo \"no keychain available\"","typeGuard":null,"tryCatchPattern":"try {\n  const out = execFileSync(\"security\", [\"find-identity\", \"-v\", \"-p\", \"codesigning\"]);\n} catch (e) {\n  console.error(\"security find-identity failed; unlock keychain or run it manually to see why:\", e.message);\n}","preventionTips":["Unlock the login keychain before signing workflows, especially on CI","Run `security find-identity` manually once during machine setup to verify health","Avoid running codesigning steps on headless machines without an imported keychain"],"tags":["macos","keychain","codesigning","process-exit"],"backgroundTag":"keychain-access-failed","analyzedSha":"a747e741ae92c09071d0ae946ab48488adcff1ce","analyzedAt":"2026-09-01T22:43:55.719Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}