macos - Mac App Store 代码签名资源信封是否始终为版本 1?

标签 macos osx-mavericks code-signing mac-app-store osx-yosemite

在最新的电子邮件详细说明了 10.10 beta 5 和 10.9.5 的网守更改后,我立即使用 TN2206 推荐的方法验证了我的应用程序。令我惊讶的是,由于我没有使用资源规则并在 Mavericks 上构建它,所以它失败了:

$ spctl -a -t exec -v /Applications/MyApp.app/
/Applications/MyApp.app/: rejected
source=obsolete resource envelope

然后,我继续检查 Xcode 存档中提交的二进制文件,该文件立即被拒绝,但没有“过时的资源信封”警告。我想那是因为它是由提交证书签名的。
$ spctl -a -t exec -v Products/Applications/MyApp.app/
Products/Applications/MyApp.app/: rejected

后来,我自己检查了资源信封:
$ codesign -d -v  /Applications/MyApp.app/
Executable=/Applications/MyApp.app/Contents/MacOS/MyApp
Identifier=my.app.id
Format=bundle with Mach-O thin (x86_64)
CodeDirectory v=20100 size=14108 flags=0x200(kill) hashes=697+5 location=embedded
Signature size=4169
Info.plist entries=34
TeamIdentifier=not set
Sealed Resources version=1 rules=5 files=82
Internal requirements count=1 size=220

然后提交的应用程序:
$ codesign -d -v  Products/Applications/MyApp.app/
Executable=/Users/jorgepeixotovasquez/Library/Developer/Xcode/Archives/2014-07-09/myapp 09-07-14 00.34.xcarchive/Products/Applications/MyApp.app/Contents/MacOS/myApp
Identifier=my.app.id
Format=bundle with Mach-O thin (x86_64)
CodeDirectory v=20200 size=14123 flags=0x0(none) hashes=697+5 location=embedded
Signature size=4393
Signed Time=09/07/2014 00:34:08
Info.plist entries=34
TeamIdentifier=F2XAAD6WWR
Sealed Resources version=2 rules=12 files=85
Internal requirements count=1 size=220

如您所见,Mac App Store 下载的应用程序只有版本 1 的资源信封,即使提交了版本 2 的资源包。可以肯定的是,我检查了我的/Application 文件夹,发现我从 Mac App Store 下载的每个应用程序都有一个版本 1 的信封,甚至是 Apple 的信封。

有谁知道这是否正常,即如果 Mac App Store 在重新签署应用程序时只添加版本一信封?
此外,这会引起问题吗?
苹果会解决这个问题吗?
修复后,我应该重新提交我的应用程序吗?

最佳答案

版本指示符(1 或 2)更多地与使用的 OS X 版本构建和签署代码有关。

资源信封版本 1 和 2

(Code signatures containing version 1 or version 2 resource envelopes are also known as version 1 signatures or version 2 signatures, respectively)



< OS X v10.9 (版本 1)
  • 仅记录资源目录中的文件,忽略其余文件。
  • 忽略符号链接(symbolic link)。
  • 如果系统小于 10.9,它会忽略版本 2 资源信封并专门使用版本 1。
  • 使用记录的签名功能 (--resource-rules) 来控制捆绑包中的哪些文件应由代码签名密封。 (10.9+ 已弃用)

  • OS X v10.9+ (第 2 版)
  • 记录嵌套代码(框架、dylib、辅助工具和应用程序、插件等)
  • 默认情况下几乎记录所有文件。
  • 记录符号链接(symbolic link)。
  • 默认情况下,生成版本 2 和版本 1 资源包络。
  • 如果 10.9+ 系统看到版本 1 签名,它将执行版本 1 验证。
  • 始终将所有文件密封在一个包中;不再需要明确指定这一点。
  • 如果存在版本 2 资源包络,则 OS X 10.9+ 及更高版本上的 codesign 不会显示版本 1 资源包络,因为只会使用版本 2 资源包络。

  • 要确定代码签名具有哪个版本的资源信封,请使用 codesign -dv :
    $ codesign -dv My.app/
    [...]
    Sealed Resources version=2 rules=15 files=53
    [...]
    

    OS X 10.9.5 和 Yosemite 开发者预览版 5 中的更改

    OS X 版本 10.9.5+ 更改
  • 使用 Mavericks 之前的 OS X 版本创建的版本 1 签名将不再被 Gatekeeper 识别并被视为过时。
  • 为了让您的应用程序在 OS X 的更新版本上运行,它们必须在 OS X 10.9 或更高版本上签名,因此具有版本 2 签名。
  • 使用以前版本的 OS X 签名的应用程序需要使用 10.9 或更高版本重新签名才能创建版本 2 签名。
  • 使用版本 2 签名的应用程序将在旧版本的 OS X 上运行。
  • 如果您的应用在 Mac App Store 上,请将您重新签名的应用作为更新提交。

  • 对于 OS X 10.9 或更高版本:
  • 仅在应包含签名代码的目录中包含签名代码。
  • 仅在应包含资源的目录中包含资源。
  • 不要使用 --resource-rules标志或 ResourceRules.plist . ( 您的应用将被拒绝 )

  • 为确保您当前和即将发布的版本与 Gatekeeper 一起正常工作,请在 OS X 版本 10.10(Seed 5 或更高版本)和 OS X 版本 10.9.5 上进行测试。

    spctl will only accept Developer ID-signed apps and apps downloaded from the Mac App Store by default. It will reject apps signed with Mac App Store development or distribution certificates.



    使用spctl在你的应用程序上是这样的:
    $ spctl -a -t exec -vv Foo.app
    

    如果您的应用程序的签名将被接受,则输出如下:
    Foo.app: accepted
    
    source=Developer ID
    

    ➣ 来源也可能是 Mac App Store。

    如果您的应用程序签名只有一个过时的版本 1 资源信封,您将看到:
    Foo.app: rejected
    
    source=obsolete resource envelope
    

    注意:必须在运行 OS X Mavericks 时对代码进行签名才能获得版本 2 签名。实际的代码签名机制是操作系统的一部分,而不是代码签名工具。将 Codesign 工具从 Mavericks 复制到较旧的 OS X 版本是行不通的。

    关于macos - Mac App Store 代码签名资源信封是否始终为版本 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25152451/

    相关文章:

    c++ - OSX 中的 Netbeans 和 Boost 库

    objective-c - Mac应用程序中的本地推送通知

    xcode - codesign --深入小牛 xcode 5.0 (5A1412)

    macos - Mac Audio随机删除-有想法吗?

    windows - 在 Windows 中对 exe 文件进行代码签名时,数字签名存储在哪里?

    xcode - 代码签名的应用程序与其 Blessed Helper 的代码签名不匹配

    ios - 嵌入式二进制签名证书始终为 'Ad Hoc Code Signed'

    swift - 从跟踪中删除 swift_deallocClassInstance

    iphone - 如何在 mac 或 iphone 上接收和播放 SHOUTcast 音频流?

    xcode - 如何使用 xcode-select 选择 XCode 3.2.6?