苹果代码签名证书怎么用?一文教你Mac应用从签名到公证
在官网发布新的Mac软件,需用苹果代码签名证书完成应用签名,再提交苹果公证,为交付文件装订公证票据,最后按用户的下载方式测试。应用使用Developer ID Application签名;如果分发PKG安装包,还要用Developer ID Installer给安装包签名。
这条流程用于Mac App Store之外的软件发布。用户在官网下载DMG,把应用拖进“应用程序”,再双击运行,整个过程都要测到。正式交付应检查下载成品、开发者身份和公证结果。

一、先分清签应用和签安装包的两种证书
为Mac应用准备签名身份,先认准Developer ID Application和Developer ID Installer这两个名字。
Application证书用于签署Mac应用,也用于相关可执行代码和DMG磁盘映像;Installer证书用于签署包含应用的PKG安装包。一个负责应用身份,一个负责安装包身份。把已签名的应用装进PKG后,仍需给PKG做对应签名,不能用Installer证书反过来签.app。
如果只分发装着应用的DMG,就不要因为文件看起来像“安装盘”,误选Installer证书。判断依据是实际格式:DMG是磁盘映像,PKG才是这里说的安装包。苹果官方的Developer ID证书指南明确列出了两种证书的用途。
申请从Apple Developer Program开发者账户开始。以手动创建证书为例,由账户持有人进入Certificates, Identifiers & Profiles,新增Developer ID证书,选择相应类型,按提示提交证书签名请求,再下载证书。双击下载的.cer后,可在“钥匙串访问”的“我的证书”中查看。
二、把应用签完整,别停在最外层的.app
Finder把.app显示成一个应用图标,里面却包含程序、框架、辅助工具和资源。公证服务会检查其中的可执行内容。主程序签好了,附带的辅助程序缺签,提交照样过不去。
先固定准备发布的版本,把要带走的框架、插件和辅助工具一并纳入签名流程。使用Xcode的标准归档、分发流程,可以让工具处理相应签名工作;自建打包流程则要逐项管理嵌套代码。不要签完后又替换应用里的可执行文件,再把旧签名当作当前成品的结果。
准备公证还要检查Hardened Runtime,也就是强化运行时,以及安全时间戳。强化运行时给程序增加运行保护,需要特殊能力的应用应声明对应权限。
安全时间戳也别只看文件生成时间。苹果官方排错文档区分了签名信息中的Timestamp和Signed Time:前者对应安全时间戳,后者不能替代它。使用Xcode的分发工作流会加入安全时间戳;自定义流程要单独确认相关设置。
技术人员可以用codesign验证应用签名,递归检查嵌套代码;PKG则用pkgutil检查安装包签名。检查的应是当前准备提交公证的那份文件。
三、公证提交后,要读处理结果和日志
Mac软件公证是苹果对提交软件进行的自动化检查,会检查恶意内容和代码签名问题。它不是Mac App Store的上架审核。通过公证的应用仍可放在开发者官网分发,也不会因此自动出现在App Store里。
使用Xcode发布Mac应用,可以先归档,在Organizer中选择相应归档,再进入Distribute App,使用Developer ID分发路径上传公证。公证完成后,重新导出带票据的发布版本,不要拿上传前导出的那份文件直接顶替最终成品。
如果团队自己制作DMG、PKG,或者使用自动构建系统,可以通过notarytool提交。苹果公证服务接收ZIP、UDIF格式磁盘映像和已签名的扁平安装包,不能直接上传一个.app目录。走ZIP路径时,先把签好的应用压缩成归档,再提交这个归档。
旧教程中使用altool上传的做法已经停用,照着旧命令反复重试没有意义。现在应使用notarytool,或采用Xcode支持的公证流程。
提交完成要保留提交编号,并查看最终状态。拿到编号只说明有了这次提交的记录,不能把它当作公证通过。即使状态为Accepted,也要下载日志看有没有警告。苹果官方明确要求成功后仍检查日志。
如果状态为Invalid,就按日志中的文件路径找问题。它指出哪个二进制签名无效,就回到那个文件检查;指出缺少安全时间戳,就补正签名设置;指出没有启用强化运行时,就修正对应目标。修好后重新生成成品并提交,别只改压缩包名字。
四、给软件装订票据,ZIP和DMG的做法不同
公证通过后,苹果会生成公证票据,也会在线发布票据,让Gatekeeper查询。Gatekeeper是macOS检查下载软件身份和安全状态的系统机制。
装订,也叫staple,就是把公证票据附到支持的交付对象上。这样用户首次打开时,即使无法联网获取票据,系统也能从软件中找到公证记录。
这里有个很容易漏掉的区别:ZIP可以提交公证,但ZIP本身不能直接装订票据。正确顺序是把票据装订到里面的.app等受支持对象,再把装订后的内容重新压缩为供用户下载的ZIP。重新压缩时保持应用内容不变。
如果最终交付的是DMG或扁平PKG,可以向对应对象装订票据。使用命令行流程的团队,通过xcrun stapler完成装订;使用Xcode自动公证流程的团队,应导出已经附带票据的成品。
公证检查的是提交的软件,装订给这份软件附上检查凭据。装订完成后再替换应用中的代码,就是另一个需要重新签名、公证的版本。把“改代码”和“附票据”分开,发布顺序才不会乱。
五、从官网重新下载,检查用户真正拿到的版本
最后一轮测试,从上传到官网的最终文件开始。测试Mac保留正常安全设置,用浏览器下载,按实际交付方式安装,再首次启动。不要直接从开发目录打开应用,也不要把此前手动批准过的旧副本当作第一次安装测试。
先看下载文件是否对应这次发布,再看开发者身份、公证状态和启动表现。技术人员还可用spctl评估应用是否符合当前机器的系统策略。codesign验证签名,spctl评估系统策略,两者回答的问题不同。
首次打开时出现“从互联网下载,是否确定打开”的确认框,是macOS向用户确认启动意图,不能把它和“无法验证开发者”混为一谈。苹果官方支持文档对这两类提示分别作了说明。签名、公证的目标是让系统识别软件身份与检查记录,并不取消用户的首次确认。
如果客户电脑只允许App Store应用,商店外的软件还受到这项设备设置限制。先分清文件问题和设备准入规则,再安排对应处理。正常发布流程应在保留系统保护的条件下完成验证。
有离线交付需求,就增加一次离线首次打开测试;有自动更新功能,就测试从旧版升级到新版。这两项都要使用最终下载包。代码签名证书、提交编号和公证状态可以记录下来,但交付是否完成,要看这份文件在目标Mac上的实际结果。
苹果代码签名证书常见问题
1、Windows的EV代码签名证书能直接给Mac应用用吗?
不能替代Developer ID身份。Mac商店外发布应用,应使用苹果Developer ID签名及公证流程。已经购买Windows软件签名证书的团队,仍需准备Mac平台对应的开发者账户和签名身份。
2、自己生成的免费代码签名证书能提交苹果公证吗?
自签名证书不能替代公证要求的Developer ID证书。本机开发测试与面向用户发布要分开处理。正式提交前先核对签名身份,避免拿开发证书、自签名证书或临时签名反复上传。
3、DMG里只有一个应用,还需要Installer证书吗?
仅因为使用DMG,不需要增加Installer证书。DMG使用Developer ID Application签名;只有制作相应PKG安装包时,才使用Developer ID Installer。里面的应用也应完成自己的签名。
4、公证通过后,为什么还要重新制作下载ZIP?
因为ZIP不能直接装订票据。提交ZIP取得公证结果后,把票据附到应用上,再压缩这个应用供用户下载。只保留最初提交的ZIP,会漏掉这次装订结果。
5、以后更新Mac软件,还要重新公证吗?
新版本修改了代码,就应重新构建、签名和公证,再完成装订与下载测试。旧版本的Accepted结果不能代替新版的处理记录。每次更新都保留代码签名与公证记录,后续排查能直接找到对应版本。
