问题是我的应用程序包在签名之前就可以工作,如果我使用
codesign
,我的应用程序包就会崩溃,而且我完全不知道如何找出原因。有人可以把我推向正确的方向吗?
我正在收到这份报告。我假设软件正确启动(是?),加载库没有问题(是?),但随后进行了一些检查并失败。我可以检查什么来找出崩溃的原因?
-------------------------------------
Translated Report (Full Report Below)
-------------------------------------
Process: bla [1386]
Path: /Users/USER/Desktop/*/bla.app/Contents/MacOS/bla
Identifier: firma.bla
Version: 1.2.572 (1.2.572)
Code Type: X86-64 (Native)
Parent Process: launchd [1]
User ID: 504
Date/Time: 2023-11-13 14:51:17.7531 +0100
OS Version: macOS 12.5 (21G72)
Report Version: 12
Anonymous UUID: 1B6A...
Sleep/Wake UUID: 1588...
Time Awake Since Boot: 4500 seconds
System Integrity Protection: enabled
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_CRASH (SIGKILL (Code Signature Invalid))
Exception Codes: 0x0000000000000001, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Reason: Namespace CODESIGNING, Code 2
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
...
我已经阅读了有关签名过程的信息并尝试了一些事情,即我可以重新签署同一捆绑包的先前版本,就像我对新版本所做的那样,并且没有任何问题。我比较了权利,它们是相同的。新的应用程序包使用新的框架,并对源代码进行了大量更改,但它们都在未签名的情况下工作,而较新的应用程序包在签名后停止工作。为什么?
我复制应用程序包并运行它 - 有效。
然后我像这样签署文件和应用程序:
% codesign --no-strict --force --timestamp --options=runtime --entitlements "bla.entitlements" --sign "Developer ID Application: ..." "bla.app/Contents/MacOS/bla"
% codesign ... "bla.app"
然后我验证签名
% codesign --verify --verbose bla.app
bla.app: valid on disk
bla.app: satisfies its Designated Requirement
然后我直接通过双击或从终端启动它,它崩溃了
% ./bla.app/Contents/MacOS/bla
zsh: killed ./bla.app/Contents/MacOS/bla
我该怎么办?
这个神秘的错误并没有说明崩溃的“具体原因”,在我的例子中,它缺少权利。当然,它与代码签名相关,但是....../叹息 如果有人可以发布答案,如何找出代码签名崩溃的具体原因,那将非常有帮助。我发布我的答案是为了告诉一些事情并解决我的具体问题。
我发现了什么:
除非下载了签名软件(涉及到网守,不能透露太多),否则此错误与公证无关,除非签名软件与未签名软件的工作原理类似,否则不要继续追究。
我希望报告能够提示缺少的权利是什么。我之前的应用程序包使用 .Net 5,新的应用程序包使用 .Net 7。我必须编辑权利文件,将下面的键更改为
true
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
...
</dict>
</plist>
此后,我的应用程序包在签名后继续工作。