最近(截至 2023-11-01)Apple 更改了他们的公证流程。
我借此机会放弃了 Apple 自己用于此过程的工具 (
notarytool
),转而使用他们的记录的 Web API 进行公证,转而使用基于 Python 的解决方案
这非常有效,并且还有额外的好处,我现在可以从 Linux 公证 macOS 应用程序(在 CI 的背景下,我可以比 macOS 运行程序更快地配置 Linux 运行程序)。万岁。
由于一切进展顺利,我考虑将我的协同设计过程的更多部分转移到 Linux,显然下一步就是找到一种将公证票装订到应用程序中的解决方案,替换
xcrun stapler staple MyApp.app
在
-vv
和一些在线文档的帮助下,事实证明,如果您知道应用程序的代码目录哈希(CDhash
),获取公证票是非常简单的。
以下内容将返回一个 JSON 对象,其中包含(除其他外)base64 编码的公证票据,只需将其解码并复制到 .app 包中即可进行装订:
cdhash=8d817db79d5c07d0deb7daf4908405f6a37c34b4
curl -X POST -H "Content-Type: application/json" \
--data "{ \"records\": { \"recordName\": \"2/2/${cdhash}\" }}" \
https://api.apple-cloudkit.com/database/1/com.apple.gk.ticket-delivery/production/public/records/lookup \
| jq -r ".records[0] | .fields | .signedTicket | .value"
因此,我的
stapler
替换仍然缺少的唯一东西是获取给定应用程序的代码目录哈希的方法。
在 macOS(安装了 XCode 工具)上,我可以使用 codesign -d -vvv MyApp.app
获取此哈希值,但这显然只有在我手头有 codesign
二进制文件时才有效。
我找到了几个用于装订票据的 python 包装器,但它们都只是在底层调用
xcrun stapler staple
。
这不是我想要的。
所以我的问题是:
如何使用 macOS 特定工具从 macOS 应用程序中提取代码目录哈希 (CDhash
)? (即:
CDhash
es是如何生成的?我还没有找到这方面的任何文档)
我非常想使用 Python 来完成这项任务。 理想情况下,这样的解决方案应该是跨平台的(因此我可以在 macOS和 Linux 上使用它,也可能在其他平台上使用)。
每个哈希值都存储在 XML 语句中每个架构的二进制段的末尾。可以 grep 出来。应用程序的 CDhash 是 Contents/MacOS 中主要可执行文件的 CDhash,如 Contents/Info.plist 中所标识
嵌入的cdhash以base64编码。第一个是英特尔的,第二个是苹果硅的:
% grep -i -a -A3 'cdhashes' mainexec | sed -n '4p;9p' | cut -f 3
HPhKLQv1j2SFYTmIgyUi/L6B9Yo=
TVNDrCQEL9A/DMWVmphntZAq7kc=
% printf "HPhKLQv1j2SFYTmIgyUi/L6B9Yo=" | base64 -d | hexdump -v -e '/1 "%02x" ' && echo ""
1cf84a2d0bf58f6485613988832522fcbe81f58a
% printf "TVNDrCQEL9A/DMWVmphntZAq7kc=" | base64 -d | hexdump -v -e '/1 "%02x" ' && echo ""
4d5343ac24042fd03f0cc5959a9867b5902aee47
与 codesign 报告的 cdhash 相比:
% codesign -dvvv -a arm64 myApp.app
Executable=myApp.app/Contents/MacOS/mainexec
Identifier=com.mycompany.myApp
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=92199 flags=0x10000(runtime) hashes=2870+7 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha256=4d5343ac24042fd03f0cc5959a9867b5902aee47
CandidateCDHashFull sha256=4d5343ac24042fd03f0cc5959a9867b5902aee4725c5a75775cd711aae76b709
Hash choices=sha256
CMSDigest=4d5343ac24042fd03f0cc5959a9867b5902aee4725c5a75775cd711aae76b709
CMSDigestType=2
Launch Constraints:
None
CDHash=4d5343ac24042fd03f0cc5959a9867b5902aee47