SSH远程连接Mac执行flutter run时xcodebuild构建失败问题
故障根因
该构建失败和Flutter、Xcode本身的配置无关,核心触发原因是macOS的安全会话隔离机制限制了SSH会话对代码签名私钥的访问权限。
日志中的com.apple.fonts is not accessible属于非GUI会话下运行xcodebuild的无害警告,和失败无直接关联;PhaseScriptExecution failed with a nonzero exit code是Xcode抛出的通用上层错误,真正的失败点是verbose日志中明确给出的errSecInternalComponent——这是macOS安全框架返回的代码签名权限不足错误。
为什么GUI登录正常、SSH登录失败
两种登录场景的系统会话权限存在本质差异:
- 本地GUI登录属于Aqua交互会话,用户完成登录后系统会自动解锁登录钥匙串,加载完整的用户安全上下文,授予签名工具访问存储在钥匙串中iOS开发证书私钥的权限,因此
flutter run全流程可以正常执行。 - SSH远程登录属于后台非交互会话,即使用户通过账号密码完成了SSH认证,系统也不会自动解锁用户登录钥匙串,不会给该会话分配访问签名私钥的安全令牌。
codesign工具在尝试读取私钥完成App签名时,拿不到对应访问权限,就会抛出errSecInternalComponent错误终止流程。
可行解决方案
按操作成本从低到高排序:
- SSH会话内手动解锁登录钥匙串
在执行flutter run之前,先在SSH终端执行以下命令解锁当前用户的登录钥匙串,将命令中的占位符替换为Mac端当前用户的登录密码即可:
解锁后当前SSH会话就拥有了钥匙串访问权限,可正常完成代码签名、构建和部署流程。security unlock-keychain -p "你的Mac用户登录密码" ~/Library/Keychains/login.keychain-db - 修改签名私钥的访问控制规则
先在Mac本地通过GUI登录系统,打开「钥匙串访问」应用,找到用于iOS调试的Apple Development证书,展开证书项下的私钥条目,右键打开「显示简介」-「访问控制」标签页,选择「允许所有应用程序访问此项目」并保存修改。配置生效后,后续SSH会话执行签名操作时不需要反复解锁钥匙串即可直接访问私钥。 - 保留Mac端GUI登录状态
不在Mac端主动注销已登录的GUI用户,仅通过锁屏保持系统运行,此时用户的安全上下文会一直驻留系统,即使通过SSH连接执行构建命令,也可以正常调用签名能力完成流程。
内容的提问来源于stack exchange,提问作者jraufeisen
相关产品推荐
相关产品推荐

