macOS如何识别从Internet下载的应用程序的签名状态?


8

我使用Safari从Internet下载了一个应用程序。执行后,macOS会通知该应用程序来自身份不明的开发人员。

macOS如何确定此信息?应用程序的签名元数据存储在哪里?


如果我理解您的问题,则会收到此警报,因为您在Safari中下载的应用程序未由Apple已知的开发人员签名。您是否在询问程序xyz在计算机上的什么位置?
Jake3231 '18

Answers:


13

该信息存储在扩展属性中,而其他信息可能嵌入在应用程序中。

扩展属性

此隔离信息存储为扩展属性。使用该xattr工具查看与文件或应用程序关联的属性。

导致此消息的属性是com.apple.quarantine

请参阅如何在Mac OS X中删除文件上的“扩展属性”?App无法打开,因为它来自一个身份不明的开发人员,以获取更多详细信息。

关守和代码签名

扩展属性由macOS上的Gatekeeper使用,并将在如何设置(还原)com.apple.quarantine属性中讨论。

嵌入在应用程序中的可选数字签名用于确定应用程序的开发人员。如果未找到签名,则macOS会将应用程序显示为来自身份不明的开发人员。


5
这不是很正确。隔离数据用于跟踪下载文件的,但签名在其他位置。
duskwuff -inactive

1
@duskwuff是正确的。隔离会导致弹出窗口“ XXX是从Internet下载的,确定要打开它吗?”。
Barmar

1
并非所有文件和应用程序都经过代码签名。许多应用程序不是,因此在这些情况下不存在嵌入式签名。对于“身份不明的开发人员”消息来说就是这种情况。
格雷厄姆·米尔恩'18

7

实际上,消息“身份不明的开发人员...”是以下两项任务组合的结果:检查com.apple.quarantine属性代码签名资源(在* / Contents / _CodeSignature / CodeResources中),而实际的签名状态为由* / CodeResources完全确定。

您可以通过输入以下内容来获取扩展属性:

$ xattr -p com.apple.quarantine /Applications/*.app

通过输入以下内容来访问代码签名信息:

$ codesign -dvvv /Applications/*.app

例:

$ codesign -dvvvv /Applications/Google\ Chrome.app/
Executable=/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
Identifier=com.google.Chrome
Format=app bundle with Mach-O thin (x86_64)
CodeDirectory v=20200 size=273 flags=0x800(restrict) hashes=3+3 location=embedded
OSPlatform=36
OSSDKVersion=658432
OSVersionMin=657664
Hash type=sha256 size=32
CandidateCDHash sha1=bc8e3dffe7d9d5242e09ea80a220ed365d46fdf2
CandidateCDHash sha256=d7ae6211906bb17d593ce9c215d190a81f37e658
Hash choices=sha1,sha256
Page size=4096
CDHash=d7ae6211906bb17d593ce9c215d190a81f37e658
Signature size=8949
Authority=Developer ID Application: Google, Inc. (EQHXZ8M8AV)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=20. Mar 2018 at 07:23:20
Info.plist entries=36
TeamIdentifier=EQHXZ8M8AV
Sealed Resources version=2 rules=7 files=203
Internal requirements count=1 size=240

最重要的部分是证书链(和信任链):

Authority=Developer ID Application: Google, Inc. (EQHXZ8M8AV)
Authority=Developer ID Certification Authority
Authority=Apple Root CA

在这里可以看到三个不同的权限:

  1. 根证书:Apple Root CA
  2. 中级Apple开发人员证书:开发人员ID证书颁发机构
  3. 开发人员证书:Google,Inc.(EQHXZ8M8AV)

这意味着该应用程序使用开发者证书签名,该证书由Apple的中间开发者权威机构发布和签名,而该机构本身由Apple的根CA发行并签名。

此链条使Google(或更确切地说是Google / Inc.的团队/部门)有资格被Apple确定为开发人员。

您也可以自己对应用程序进行代码签名,也可以使用其他中间/根机构的代码签名证书对应用程序进行代码签名,但这不会克服Gatekeeper。

现在,假设启用了网闸(但不考虑自签名/外来签名),则可以进行四个排列:

  • 没有com.apple.quarantine属性/没有Apple Developer证书(例如:安装了brew cask的Apache CouchDB
  • 没有com.apple.quarantine属性/ Apple Developer证书(例如:安装了brew cask的Google Chrome
  • com.apple.quarantine属性/没有Apple Developer证书(示例:通过从网站下载zip并将解压缩的应用程序复制到/ Applications /来安装Apache CouchDB
  • com.apple.quarantine属性/ Apple Developer证书(例如:通过从网站下载dmg并将其中的应用程序复制到/ Applications /来安装Google Chrome

在前两种情况下,该应用将简单启动。在第三种情况下,您将收到Unindentified Developer消息。您可以通过删除扩展属性来解决此问题xattr -d com.apple.quarantine *(=情况1)。在第四种情况下,您将获得“ *是从Internet下载的,确定要打开它吗?”。


5

macOS如何确定此信息?应用程序的签名元数据存储在哪里?

签名存储在应用程序二进制文件本身中,一些附加数据存储在应用程序包中(在文件中Contents/_CodeSignature/CodeResources)。

您可以使用命令行实用程序获取有关签名的一些信息codesign,例如:

# codesign -dv /Applications/Preview.app
Executable=/Applications/Preview.app/Contents/MacOS/Preview
Identifier=com.apple.Preview
Format=app bundle with Mach-O thin (x86_64)
CodeDirectory v=20100 size=21314 flags=0x0(none) hashes=659+5 location=embedded
Platform identifier=4
Signature size=4485
Info.plist entries=35
TeamIdentifier=not set
Sealed Resources version=2 rules=13 files=2077
Internal requirements count=1 size=68
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.