[关闭]
@Rookie 2020-04-01T02:11:45.000000Z 字数 3055 阅读 867

App 签名相关

iOS开发


前因, 群里面一位大佬用 nwjs 开发了 mac App, 因为签名问题分发给客户因为Gatekeeper 机制, 导致用户安装 APP 体验过程不好.苹果官方也有介绍「OS X:关于 Gatekeeper」

Gatekeeper 功能是干什么的?

Gatekeeper 是苹果的一种反恶意软件的功能,于2012年7月被推出,旨在阻止不可信的、存在问题的应用程序的运行,使Mac OS X系统免受恶意软件的影响。需要手动关闭 SIP 功能后才可以运行软件。「关闭 Mac 的 SIP 安全设置功能教程」或者 「打开任何来源,解决Mac提示文件“已损坏”的问题」

Gatekeeper怎么解决

macOS 中的“门禁”会检查在 Mac App Store 以外地方的 app 中是否配有 Developer ID 证书,避免用户下载和安装恶意软件。在分发任何 app、插件或安装器软件包之前,请务必对它们进行签名,以便让“门禁”知道安装这些内容是安全的。现在,您可以将在 macOS Mojave 上运行的 app 提交到 Apple 进行公证,从而进一步提高用户对您 app 的信心。「苹果官方说明」

iOS App 签名的原理

image_1e4pn4lha1ucapcct9tah6184l9.png-150.1kB

Developer ID Application证书制作

Developer Certificate

Mac Development:这个只用来开发,Debug,不是正式发布的版本

Production Certificate

Developer ID Application:这个用于开发者使用开发者帐号签名,导出一个线下发布版本的.app文件,脱离了苹果的Mac App Store。

Developer ID Installer:用于开发者打包,同时加上开发者帐号签名,打包工具在下面介绍。

Mac App Distribution:这个用于Xcode自己把.app文件上传到Mac App Store

Mac Installer Distribution:这个没用过,但可以肯定的,也是上传Mac App Store用的

Mac App Store

Developer ID

我们主要需要的就是「Developer ID Application」这个类型的证书,「Mac Development」只是用于开发的,而前者可以供分发,也就是签名后,别人下载安装,就是来自「被认证的开发者」的应用啦。

Developer ID Application证书制作
Mac App 发布的最后 1km

使用 Xcode 进行签名

使用 Developer ID 为 Mac app 签名(不导入环境变量)

$ codesign -f -s "Developer ID Application: XXXXX (4J45KSVBG8)" ST.app

MAC OS 上的app签名与打包

如果出现resource fork, finder information, or similar detritus not allowed错误,可以参数运行xattr -rc FutuNiuniu.app, 相关说明看这里

另外一种签名方法(没试验过)

  1. # Do not forget to update the above vars
  2. # IDENTITY is the string you have saved in the "Requesting certificates" step
  3. export IDENTITY=LK12345678
  4. export PARENT_PLIST=/path/to/parent.plist
  5. export CHILD_PLIST=/path/to/child.plist
  6. export APP_PATH=/path/to/yourapp/YourApp.app
  7. codesign --deep -s $IDENTITY --entitlements $CHILD_PLIST $APP_PATH"/Contents/Versions/CHROMIUMVERSIONHERE/nwjs Helper.app" -f
  8. codesign --deep -s $IDENTITY --entitlements $PARENT_PLIST $APP_PATH -f

MAS: Signing the app

验证签名

我们可以从应用程序目录随便挑几个App试试,使用参数➜ codesign -v FutuNiuniu.app 如果App已签名,什么都不会打印,如果App未签名,则会打印 FutuNiuniu.app code object is not signed at all

对于已签名的App,使用参数-vvv会有略详细的输出结果,如果使用参数-dvvv会有非常详细的签名情况

  1. yan% codesign -dvvv /Users/yuanren/Desktop/xfish.app
  2. Executable=/Users/yuanren/Desktop/xfish.app/Contents/MacOS/nwjs
  3. Identifier=io.nwjs.nwjs
  4. Format=app bundle with Mach-O thin (x86_64)
  5. CodeDirectory v=20200 size=268 flags=0x0(none) hashes=3+3 location=embedded
  6. Hash type=sha256 size=32
  7. CandidateCDHash sha1=c268d10248265aacfad95d0da3df9ba969526591
  8. CandidateCDHash sha256=fbc07c23d5f9b6ccdebcd9d4e2f3a3c5ce23bcc2
  9. Hash choices=sha1,sha256
  10. CDHash=fbc07c23d5f9b6ccdebcd9d4e2f3a3c5ce23bcc2
  11. Signature size=9051
  12. Authority=Developer ID Application: yafang liu (3259YVRKR7)
  13. Authority=Developer ID Certification Authority
  14. Authority=Apple Root CA
  15. Timestamp=Mar 31, 2020 at 4:56:44 PM
  16. Info.plist entries=32
  17. TeamIdentifier=3259YVRKR7
  18. Sealed Resources version=2 rules=13 files=11995
  19. Internal requirements count=1 size=172

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注