我正在使用有效的开发者 ID 配置文件签署包含.app
的.dmg
。一切都签署,包括框架。当我运行codesign -dvvv
时,会出现正确的证书并且satisfies its Designated Requirement
。应用运行正常。
但是,当我上传并下载.dmg
时,签名“消失”。当我运行codesign -dvvv
时,它会说code object is not signed at all
。并且 GateKeeper 自然拒绝运行该应用程序。
注意:它听起来很像这个问题,但我肯定使用正确的开发者 ID 证书签名,并且.dmg
不会出现“损坏”。
1 回答
[注意:OS X v10.11.5 和 v10.12 的情况发生了显着变化。这个答案已经更新,以反映这一点。]
通常,您真正需要签名的是磁盘映像内的文件(主要是应用程序),而不是映像本身。下载图像后,将在使用时检查各个项目上的签名。从 OS X 10.11.5 开始,正确支持签名磁盘映像,有时也需要签名磁盘映像,但除了在其中签署相关项目之外。
通过 OS X v10.11.4,您可以对磁盘映像本身进行签名(使用
codesign -s "Developer ID Application: [your company]" example.dmg
),但是它创建的签名以附加到映像文件的扩展属性的形式存储。实际上,它会创建三个 xattrs,名为com.apple.cs.CodeDirectory
,com.apple.cs.CodeRequirements
和com.apple.cs.CodeSignature
。要实现的关键是这些属性是文件系统元数据 - 也就是说,它们附加到文件,而不是文件内容的一部分。 HTTP 协议对文件系统元数据的支持非常有限,因此当您通过 HTTP(或 FTP or...))上传或下载时,它只传输文件的内容,并且 xattrs 会丢失。您可以使用
ls -l@
命令查看 xattrs(使用xattr
命令可以更详细地看到):下载后,图像将丢失这些属性(并且可能从下载过程中获得了
com.apple.quarantine
和com.apple.metadata:kMDItemWhereFroms
),因此不会被视为已签名。另一方面,它中包含的文件仍应正确签名(因为它们的签名是图像文件的一部分 contents.)从 OS X v10.11.5 开始,
codesign
支持将签名嵌入磁盘映像本身,这样它就可以通过 HTTP 下载。从 v10.12 开始,网守将对未签名磁盘映像中的应用程序强制执行其他限制,这些限制将阻止应用程序从磁盘映像加载其他内容(主要是动态库),除非它们包含在应用程序本身中。如果您不知道这是否与您的应用程序相关,请继续签署磁盘映像(实际上,无论如何都是个好主意),但请务必在 10.11.5 或更高版本下运行codesign
,否则签名将无法使用格式!