欢迎各位兄弟 发布技术文章
这里的技术是共享的
在 macOS 中,Code Requirement(代码要求)是与代码签名(Code Signing)相关的一个概念,它是用于描述对可执行文件、库、插件或其他代码的签名验证规则的表达式。具体来说:
代码签名的一部分:
在 macOS 中,应用程序、内核扩展(kext)、守护进程(Daemons)等可执行文件需要通过苹果的代码签名验证才能运行。
Code Requirement 是签名证书中嵌入的一组规则,用于定义该签名必须满足的条件(例如:特定的证书、Bundle ID、哈希值等)。
用于安全验证:
系统(如 Gatekeeper、守护进程管理工具 launchd)会检查文件的签名是否符合预设的 Code Requirement,以确保代码未被篡改或来源可信。
签名时的约束:
开发者可以为签名的代码定义要求(例如:“必须由 Apple 开发者证书签名” 或 “Bundle ID 必须为 com.example.app”)。
Developer ID 和 App Notarization:
苹果的公证(Notarization)服务会检查代码是否满足严格的 Code Requirement 规则(如 hardened runtime 要求)。
系统策略:
macOS 系统组件(如 launchd)可能要求某些进程必须满足特定的 Code Requirement 才能运行(例如:权限敏感的守护进程)。
语法:Code Requirement 是一个二进制或字符串格式的规则集,使用专用语法描述条件。例如:
plaintextidentifier "com.apple.Safari" and anchor apple
表示:“必须是 Bundle ID 为 com.apple.Safari 且由苹果官方签名的应用”。
查看现有签名中的 Requirement:
可以通过命令行工具 codesign 查看:
bashcodesign -d -r - /Applications/Safari.app
输出会显示该应用的签名要求。
自定义 Requirement:
开发者可以在签名时通过 codesign 的 --requirements 参数指定自定义规则。
苹果系统应用的要求:
macOS 可能要求系统核心组件必须满足:
plaintextanchor apple and certificate root = H"XYZ123..."
(由苹果根证书签名且证书指纹匹配)。
沙盒授权(Sandbox Entitlements):
沙盒配置可能通过 Code Requirement 限制只有特定签名的应用才能访问某些权限。
Code Requirement 是 macOS 安全模型中的重要机制,它通过预定义的规则约束代码签名的有效性,确保只有符合要求的代码才能运行或获得权限。这对于系统完整性、恶意软件防护和开发者信任链至关重要。
identifier "com.apple.Safari" and anchor apple 翻译成中文
将 macOS 中 Code Requirement 的规则表达式:
identifier "com.apple.Safari" and anchor apple
翻译为中文后,可以表述为:
“标识符为 'com.apple.Safari' 且由苹果官方签名”
identifier "com.apple.Safari"
→ 要求可执行文件的 Bundle ID(标识符)必须为 com.apple.Safari。
anchor apple
→ 要求签名证书链必须包含苹果的官方根证书(即由苹果直接签名)。
and
→ 逻辑“与”,表示两个条件必须同时满足。
此规则通常用于系统或安全策略,例如:
macOS 可能要求 Safari 浏览器必须同时满足这两个条件才能运行,防止恶意软件伪造签名或篡改 Bundle ID。
类似的规则也适用于其他苹果系统应用(如 Mail、Notes 等)。
你提出的问题非常关键,而且确实 在较新版本的 Jamf Pro(尤其是 macOS Monterey 及更高版本 + Jamf 10.35+)中,Apple 对 PPPC(Privacy Preferences Policy Control)配置文件的要求变得更严格:Code Requirement 字段在某些情况下不再允许留空,否则描述文件安装后可能 不生效 或被系统忽略。
com.tencent.WeWorkMac 填写有效的 Code Requirement它是 Apple 用于验证应用身份的一种机制,基于应用的代码签名信息(如 Team ID、证书等)。即使 Bundle ID 相同,若签名不同(如企业内部分发 vs App Store),也需要匹配正确的 Code Requirement。
在已安装企业微信的 Mac 上运行以下命令:
编辑
💡 如果提示“command not found”或权限问题,请确保路径正确。也可以用:
编辑
但更可靠的是直接提取 designated requirement:
编辑
编辑
其中:
5K222Q48VY 是腾讯的 Team ID(开发者账号标识)
这个字符串就是你需要填入 Jamf 的 Code Requirement
⚠️ 注意:不同分发渠道(App Store / 官网下载 / 企业定制版)的 Team ID 可能不同!务必在目标设备上实测。
在 Privacy Preferences Policy Control 配置中,填写:
| 字段 | 值 |
|---|---|
| Identifier | com.tencent.WeWorkMac |
| Identifier Type | Bundle ID |
| Code Requirement | identifier "com.tencent.WeWorkMac" and anchor apple generic and certificate leaf[subject.OU] = "5K222Q48VY" |
| Allowed | ✅ 勾选 |
| Service | ScreenCapture |
✅ 这样 Jamf 生成的
.mobileconfig才会被 macOS TCC 框架信任并生效。
你可以用以下命令测试是否匹配:
编辑
或者手动验证签名:
编辑
如果你管理大量应用,可以写脚本自动提取:
编辑
macOS 11 (Big Sur) 之前:TCC 对 PPPC 描述文件校验较宽松,Bundle ID 足够。
macOS 12+ (Monterey):Apple 强化了安全策略,要求必须提供有效的 Code Requirement,以防止恶意应用通过伪造 Bundle ID 获取权限。
Jamf Pro 10.35+:UI 中也强制要求填写(或至少警告),否则同步到设备后权限无效。
安装后,在终端运行:
编辑
如果看到 auth_value: 2 且 allowed: 1,说明成功。
或者检查系统日志:
编辑
Code Requirement不能为空 —— 必须填写与企业微信实际签名匹配的字符串。
✅ 正确流程:
在目标 Mac 上运行 codesign -d -r- /Applications/企业微信.app
复制输出的 designated => ... 后的内容
在 Jamf PPPC 配置中填入该 Code Requirement
通过 Self Service 分发,用户点击即静默授权
这样即可 合规、可靠、无弹窗 地授予企业微信屏幕录制权限。