可在mac上通过钥匙串访问创建自签名代码签名证书:一、创建并信任“mylocalca”根证书;二、基于该ca生成“mydevelopercert”开发者证书;三、导出为.p12格式;四、在xcode中配置使用;五、用codesign命令行签名验证。

如果您在Mac上进行本地开发,需要为应用程序或脚本启用代码签名但无法使用Apple官方开发者证书,则可通过钥匙串访问工具创建自签名代码签名证书。以下是实现此目标的具体步骤:
一、使用钥匙串访问创建证书颁发机构(CA)
创建自签名代码签名证书前,需先建立一个受信任的根证书颁发机构(CA),该CA将用于签发后续的开发者证书,并可被系统本地信任。此步骤确保签名后的二进制文件在Gatekeeper检查中不被拦截。
1、打开“钥匙串访问”应用(位于“应用程序”→“实用工具”中)。
2、在菜单栏选择“钥匙串访问”→“证书助理”→“创建证书”。
3、在弹出窗口中,将“证书名称”设为“MyLocalCA”;“证书类型”选择“自签名根证书”;“信任设置”勾选“让我手动信任此证书”。
4、点击“继续”,在“密钥对信息”中保持默认选项,点击“继续”完成创建。
5、在钥匙串列表中找到“MyLocalCA”,双击打开,展开“信任”项,将“使用此证书时”设为始终信任,关闭窗口并输入密码确认更改。
二、生成开发者身份证书(Code Signing Certificate)
基于已创建并信任的本地CA,生成一个专用于代码签名的终端实体证书。该证书将包含扩展密钥用法(EKU)标识,明确支持代码签名功能,避免因用途不符导致签名失败。
1、再次进入“钥匙串访问”→“证书助理”→“创建证书”。
2、将“证书名称”设为“MyDeveloperCert”;“证书类型”选择“由现有证书颁发机构签名”;在下方下拉菜单中选择“MyLocalCA”。
3、勾选“让我指定密钥对信息”,点击“继续”。
4、在“密钥对信息”中,“密钥大小”设为2048位或4096位,“算法”选择RSA;点击“继续”。
5、在“证书设置”中,勾选“代码签名”和“SSL客户端”;取消勾选其他用途;点击“继续”完成创建。
三、导出P12格式证书供Xcode或命令行使用
生成的证书默认仅存于登录钥匙串中,若需在Xcode项目配置或codesign命令中调用,必须导出为.p12格式并携带私钥。导出过程需设定密码保护,且该密码将在后续导入或签名时被要求输入。
1、在钥匙串访问中,于“登录”钥匙串下找到“MyDeveloperCert”,同时按住Command键选中其对应的私钥(显示为“MyDeveloperCert”的三角箭头展开项中的“私钥”)。
2、右键选中项,选择“导出 2 个项目…”。
3、保存类型设为“Personal Information Exchange (.p12)”;文件名设为“MyDeveloperCert.p12”;点击“保存”。
4、在弹出的密码框中输入并确认至少8位含大小写字母与数字的强密码,点击“确定”。
四、在Xcode中配置签名证书
Xcode需识别并使用该证书进行自动签名或手动签名。证书必须出现在“登录”钥匙串且状态为有效,同时Xcode需重启以刷新证书缓存,否则可能显示“无匹配证书”错误。
1、打开Xcode项目,点击项目导航器中的项目名,选择目标(Target)→“签名与功能”(Signing & Capabilities)。
2、取消勾选“自动管理签名”,在“签名证书”下拉菜单中查找“MyDeveloperCert”。
3、若未出现,点击右下角“+”添加证书,或前往Xcode菜单“Xcode”→“设置”→“账户”→“管理证书”,点击左下角“+”→“添加 iOS Development”并选择“MyDeveloperCert”。
4、确保团队显示为“None (MyDeveloperCert)”,构建时不再提示证书缺失。
五、使用codesign命令行签名可执行文件
对于Shell脚本、命令行工具或非Xcode构建产物,可直接调用系统codesign工具完成签名。签名时必须指定证书全名(含组织信息),且需确保钥匙串处于解锁状态,否则签名会因权限拒绝而失败。
1、打开终端,执行命令查看可用证书:security find-identity -v -p codesigning,确认输出中包含“MyDeveloperCert”条目。
2、对可执行文件签名:运行codesign --force --sign "MyDeveloperCert" /path/to/your/executable。
3、验证签名有效性:执行codesign --display --verbose=4 /path/to/your/executable,检查“Authority”字段是否为“MyDeveloperCert”。
4、若提示“keychain password not available”,请先运行security unlock-keychain login.keychain-db并输入登录密码。











