欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

macos 中 Code Requirement 是什么 AG chatgpt 有大用

在 macOS 中,Code Requirement(代码要求)是与代码签名(Code Signing)相关的一个概念,它是用于描述对可执行文件、库、插件或其他代码的签名验证规则的表达式。具体来说:


Code Requirement 的定义

  1. 代码签名的一部分

  • 在 macOS 中,应用程序、内核扩展(kext)、守护进程(Daemons)等可执行文件需要通过苹果的代码签名验证才能运行。

  • Code Requirement 是签名证书中嵌入的一组规则,用于定义该签名必须满足的条件(例如:特定的证书、Bundle ID、哈希值等)。

  • 用于安全验证

    • 系统(如 Gatekeeper、守护进程管理工具 launchd)会检查文件的签名是否符合预设的 Code Requirement,以确保代码未被篡改或来源可信。


    Code Requirement 的常见用途

    1. 签名时的约束

    • 开发者可以为签名的代码定义要求(例如:“必须由 Apple 开发者证书签名” 或 “Bundle ID 必须为 com.example.app”)。

  • Developer ID 和 App Notarization

    • 苹果的公证(Notarization)服务会检查代码是否满足严格的 Code Requirement 规则(如 hardened runtime 要求)。

  • 系统策略

    • macOS 系统组件(如 launchd)可能要求某些进程必须满足特定的 Code Requirement 才能运行(例如:权限敏感的守护进程)。


    技术细节

    • 语法
      Code Requirement 是一个二进制或字符串格式的规则集,使用专用语法描述条件。例如:

      plaintext
      identifier "com.apple.Safari" and anchor apple

      表示:“必须是 Bundle ID 为 com.apple.Safari 且由苹果官方签名的应用”。

    • 查看现有签名中的 Requirement
      可以通过命令行工具 codesign 查看:

      bash
      codesign -d -r - /Applications/Safari.app

      输出会显示该应用的签名要求。

    • 自定义 Requirement
      开发者可以在签名时通过 codesign 的 --requirements 参数指定自定义规则。


    示例场景

    1. 苹果系统应用的要求
      macOS 可能要求系统核心组件必须满足:

      plaintext
      anchor apple and certificate root = H"XYZ123..."

      (由苹果根证书签名且证书指纹匹配)。

    2. 沙盒授权(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

    什么是 Code Requirement?

    它是 Apple 用于验证应用身份的一种机制,基于应用的代码签名信息(如 Team ID、证书等)。即使 Bundle ID 相同,若签名不同(如企业内部分发 vs App Store),也需要匹配正确的 Code Requirement。


    第一步:获取企业微信的 Code Requirement

    在已安装企业微信的 Mac 上运行以下命令:

    bash
    编辑
    codesign -d -r- /Applications/企业微信.app 2>&1 | awk -F 'designated => ' '{print $2}'

    💡 如果提示“command not found”或权限问题,请确保路径正确。也可以用:

    bash
    编辑
    codesign -d --entitlements :- /Applications/企业微信.app 2>&1 | grep -A5 "designated"

    但更可靠的是直接提取 designated requirement

    bash
    编辑
    codesign -d -r- "/Applications/企业微信.app" 2>&1 | grep "designated" | sed 's/.*=> //'

    示例输出(真实企业微信):

    text
    编辑
    identifier "com.tencent.WeWorkMac" and anchor apple generic and certificate leaf[subject.OU] = "5K222Q48VY"

    其中:

    • 5K222Q48VY 是腾讯的 Team ID(开发者账号标识)

    • 这个字符串就是你需要填入 Jamf 的 Code Requirement

    ⚠️ 注意:不同分发渠道(App Store / 官网下载 / 企业定制版)的 Team ID 可能不同!务必在目标设备上实测。


    第二步:在 Jamf Pro 中填写完整字段

    Privacy Preferences Policy Control 配置中,填写:

    字段
    Identifiercom.tencent.WeWorkMac
    Identifier TypeBundle ID
    Code Requirementidentifier "com.tencent.WeWorkMac" and anchor apple generic and certificate leaf[subject.OU] = "5K222Q48VY"
    Allowed✅ 勾选
    ServiceScreenCapture

    ✅ 这样 Jamf 生成的 .mobileconfig 才会被 macOS TCC 框架信任并生效。


    第三步(可选):验证 Code Requirement 是否有效

    你可以用以下命令测试是否匹配:

    bash
    编辑
    # 检查当前应用是否满足该 requirement
    spctl -a -t exec -vvv "/Applications/企业微信.app"

    或者手动验证签名:

    bash
    编辑
    codesign -v "/Applications/企业微信.app" && echo "Valid"

    🔁 自动化建议:批量获取 Code Requirement

    如果你管理大量应用,可以写脚本自动提取:

    bash
    编辑
    #!/bin/bash
    APP_PATH="/Applications/企业微信.app"
    if [ -d "$APP_path" ]; then
      codesign -d -r- "$APP_PATH" 2>&1 | awk -F 'designated => ' 'NF==2 {print $2}'
    else
      echo "App not found at $APP_PATH"
    fi

    ❓为什么以前可以留空,现在不行?

    • macOS 11 (Big Sur) 之前:TCC 对 PPPC 描述文件校验较宽松,Bundle ID 足够。

    • macOS 12+ (Monterey):Apple 强化了安全策略,要求必须提供有效的 Code Requirement,以防止恶意应用通过伪造 Bundle ID 获取权限。

    • Jamf Pro 10.35+:UI 中也强制要求填写(或至少警告),否则同步到设备后权限无效。


    ✅ 最终确认:描述文件是否生效?

    安装后,在终端运行:

    bash
    编辑
    tccutil dump ScreenCapture | grep -A5 -B5 "com.tencent.WeWorkMac"

    如果看到 auth_value: 2allowed: 1,说明成功。

    或者检查系统日志:

    bash
    编辑
    log show --predicate 'subsystem == "com.apple.TCC"' --info --last 1h | grep WeWorkMac

    总结

    Code Requirement 不能为空 —— 必须填写与企业微信实际签名匹配的字符串。

    ✅ 正确流程:

    1. 在目标 Mac 上运行 codesign -d -r- /Applications/企业微信.app

    2. 复制输出的 designated => ... 后的内容

    3. 在 Jamf PPPC 配置中填入该 Code Requirement

    4. 通过 Self Service 分发,用户点击即静默授权

    这样即可 合规、可靠、无弹窗 地授予企业微信屏幕录制权限。


    普通分类: