最近(截至2023-11-01)Apple更改了他们的公证流程。
我利用这个机会放弃了苹果自己的这个过程的工具(notarytool
),并使用他们的documented Web API for notarization切换到基于Python的解决方案
这很好用,还有一个额外的好处,我现在可以从Linux公证macOS应用程序(在CI的上下文中,我可以比macOS runners更快地提供linux runners)。
由于这一切进行得如此顺利,我考虑将我的协同设计过程的更多部分转移到Linux上,显然下一步是找到一个解决方案,将公证票装订到应用程序中,取代xcrun stapler staple MyApp.app
在-vv
和onlinedocumentation的一些碎片的帮助下,如果你知道你的应用程序的代码目录哈希(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 Package 器,但它们都只是在后台调用xcrun stapler staple
。这不是我想要的**。
所以我的问题是:如何在不使用macOS特定工具的情况下从macOS应用程序中提取代码目录哈希(CDhash
)?(即:如何生成CDhash
es?我没有找到任何相关文档)
我非常希望使用Python来完成这项任务。理想情况下,这样的解决方案应该是跨平台的(因此我可以在macOS * 和 * Linux上使用它,可能也可以在其他平台上使用它)。
2条答案
按热度按时间deyfvvtc1#
如何在不使用macOS特定工具的情况下从macOS应用程序中提取代码目录哈希(CDhash)?
应用程序的CDhash是Contents/Info.plist中标识的Contents/MacOS中主可执行文件的CDhash
每个散列都存储在XML语句中每个体系结构的二进制段的末尾。
嵌入的cdhash是用base64编码的。第一个是intel的,第二个是apple silicon的:
字符串
与codesign报告的cdhash相比:
型
prdp8dxp2#
基于Richard's answer,这是我最终使用的(有更多的错误检查):
字符串
仍然有一些粗糙的边缘尚未处理(例如,如果二进制文件包含多个产生不同票据的CDHash(每个CDHash用于通用二进制文件的每个体系结构),则决定装订哪个票据),但基本工作现在正在进行。