MacOS 签名机制

简单记录 macos 中签名工具、签名验证策略的使用方法

简要说明

MachO,MacOS 系统中可执行程序、类库的标准文件结构。支持多体系。LC_CODE_SIGNATURE,MachO 的数字签名数据段,存在每个体系的尾部。 基于 RFC2315、PKCS#7, 区别与 Windows 直接使用 P7 数字信封进行软件的签名验证,Apple 为了更高的安全性,制定了专用的签名结构块, 以保障 App 包里所有文件的完整性。

工具使用

1、使用 Developer ID证书进行签名。 如果您使用任何其他证书(例如Mac App Distribution证书或自签名证书),则公证失败。使用spctl 工具来确定要签名结果是否符合当前系统策略:

 spctl -vvv --assess --type exec /path/to/application 

2、要求带有时间戳签名。Xcode构建的应用程序,默认不带有时间戳签名。使用codesign 工具检测二进制文件是否具有安全时间戳。

  codesign -dvv /path/to/binary/or/bundle 

3、启用运行时强化功能并指定应用所需 entitlements

codesign -s 'xxx' -o runtime --entitlements entitle.provision xx.app

4、避免使用 com.apple.security.get-task-allow

公证应用包

官方参考说明

  1. 将应用包压缩后,提交公证

    xcrun altool --notarize-app
                --primary-bundle-id "com.example.ote.zip" //自定义标识
                --username "AC_USERNAME"
                --password "@keychain:AC_PASSWORD" // app专用密码
                --asc-provider // 可选
                --file OvernightTextEditor_11.6.8.zip
    
  2. 等待一段时间,查看公证结果

    xcrun altool --notarization-history 0 -u "AC_USERNAME" -p "@keychain:AC_PASSWORD"

  3. 查看详细日志

    xcrun altool --notarization-info '提交后返回的 ID' -u "AC_USERNAME"