Mac Electron 应用签名(signature)和公证(notarization)

在MacOS 10.14.5之后,如果应用没有在苹果官方平台进行公证notarization(我们可以理解为安装包需要审核,来判断是否存在病毒),那么就不能被安装。当然现在很多人的解决方案都是使用sudo spctl --master-disable,取消验证模式,但是总体给客户培训下来,效果非常差,很多人找不到终端,有的人甚至不能在终端中输入命令。因此急需找到解决问题的源头,如何进行代码公证。

1、签名

在App进行公证之前,App首先必须有一个签名,来证明这个app的开发者是谁:

首先你需要有一个苹果开发者账号

首先,找到开发电脑的钥匙串,找到证书助理,创建一个从证书机构请求证书

填写自己的信息,并保存,生成一个CertificateSigningRequest.certSigningRequest文件。

现在需要生成 Developer ID Application证书

登录苹果开发者网站:https://developer.apple.com/account/resources/certificates/add

添加 Developer ID Application类型证书:

导入上面生成的CertificateSigningRequest.certSigningRequest文件,导入完成之后即可下载我们需要的证书了:

下载到电脑之后,双击一下,证书就被安装到了钥匙串中了。

此时,打开钥匙串,选择登录 钥匙串,并在我的证书栏找到刚才导入的证书:

右键并下载,

保存成p12文件:

保存到你的路劲之后,此时需要配置环境变量:

bash 复制代码
export CSC_LINK='你的p12文件路径'
export CSC_KEY_PASSWORD='你创建p12文件的密码'

验证:

bash 复制代码
security find-identity -v -p codesigning

  1. 公证

之前使用的altool工具被苹果打回了,现在只能使用notarytool工具打包了,具体文档可以查看这篇文章:

https://developer.apple.com/documentation/technotes/tn3147-migrating-to-the-latest-notarization-tool 直接上命令行:

存储凭据

bash 复制代码
xcrun notarytool store-credentials "ac_dblens" \
                                   --apple-id "开发者@qq.com" \
                                   --team-id "证书(xxx)" \
                                   --password "xxxx"

下面来解释一下所有参数的意义:

  • your_apple_id 你的苹果开发者账号
  • password 你的应用专属密码,和你的苹果开发者账号密码不一样,可以查阅相关资料设置应用专属密码
  • team_id 你的团队id
  • ac_dblens : "随便取,钥匙串条目名称"
提交公证
bash 复制代码
xcrun notarytool submit "/Users/xxxxx-0.0.7-arm64.dmg" \
                        --keychain-profile "ac_dblens" \
                        --wait

检查公证状态

提交后,如果需要检查公证状态,可以使用以下命令:

bash 复制代码
xcrun notarytool info <submission_id> \
                      --keychain-profile "AC_PASSWORD"
  • <submission_id>:提交公证时返回的 UUID。

  • "AC_PASSWORD":钥匙串条目的名称。

附加公证票据

公证成功后,将公证票据附加到 DMG 文件中:

bash 复制代码
xcrun stapler staple "/path/to/your/app.dmg"
  • /path/to/your/app.dmg:替换为你的 DMG 文件路径。

验证票据

bash 复制代码
xcrun stapler validate "/path/to/your/app.dmg"

附加公证票据 (Staple Notarization Ticket)是 macOS 公证流程中的一个重要步骤。它的作用是将 Apple 公证服务生成的票据(Ticket)直接嵌入到应用程序或安装包(如 .app.pkg.dmg)中。这样,即使用户的设备无法访问互联网,也可以验证软件的真实性和安全性。


附加公证票据的作用

  1. 离线验证

    • 公证票据包含了 Apple 对软件的验证信息。

    • 附加票据后,即使用户的设备处于离线状态,macOS 仍然可以验证软件的合法性。

  2. 提高用户体验

    • 如果没有附加票据,macOS 在首次运行软件时会尝试从 Apple 服务器下载公证信息。这可能会导致延迟或失败(例如网络问题)。

    • 附加票据后,验证过程会更快,用户体验更流畅。

  3. 增强安全性

    • 公证票据证明了软件已经通过 Apple 的公证检查,确保软件没有被篡改或包含恶意代码。

    • 附加票据后,macOS 可以更严格地验证软件的完整性。

  4. 满足分发要求

    • 对于通过非 Mac App Store 分发的软件(如直接下载或第三方渠道),Apple 要求软件必须经过公证并附加票据。

使用 xcrun notarytool submit 提交公证请求时,添加 --wait 参数会让命令等待公证完成并返回结果。等待时间通常取决于文件大小、Apple 服务器的负载以及公证队列的长度。以下是关于等待时间的具体说明和建议:


等待时间

  1. 典型等待时间

    • 对于大多数小型或中型文件(如几十 MB 到几百 MB),公证通常在 几分钟到半小时 内完成。

    • 对于较大的文件(如超过 1 GB),可能需要 更长时间(例如 1 小时或更久)。

  2. 影响因素

    • 文件大小:文件越大,处理时间越长。

    • 服务器负载:Apple 的公证服务器负载较高时(例如新版本 Xcode 发布后),处理时间可能会延长。

    • 网络速度:上传文件到 Apple 服务器的速度也会影响总时间。

  3. --wait 参数的作用

    • 添加 --wait 参数后,命令会一直等待,直到公证完成并返回最终结果。

    • 如果不添加 --wait,命令会立即返回提交 ID,你需要手动检查公证状态。

重新提交公证

如果等待时间过长(例如超过 3 小时),可以尝试取消当前提交并重新提交:

bash 复制代码
xcrun notarytool cancel "fba3eb0c-5169-4bee-b2f4-3ba18dafb3f9" \
                        --keychain-profile "ac_dblens"

然后重新提交:

bash 复制代码
xcrun notarytool submit "/path/to/your/xxx-arm64.dmg" \
                        --keychain-profile "ac_dblens" \
                        --wait

参考:Mac Electron 应用如何进行签名(signature)和公证(notarization)?_electron mac签名-CSDN博客

相关推荐
Easonmax40 分钟前
【javaSE】内部类(来自类和对象的补充)
开发语言·javascript·ecmascript
新青年.3 小时前
【uniapp】uniapp使用java线程池
javascript·uni-app
答题卡上的情书3 小时前
uniapp版本升级
前端·javascript·uni-app
枫叶丹43 小时前
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
开发语言·前端·javascript·华为·harmonyos
有杨既安然4 小时前
Vue.js组件开发深度指南:从零到可复用的艺术
前端·javascript·vue.js·npm
小韩学长yyds5 小时前
前端实战:小程序搭建商品购物全流程
javascript·css·vue.js·小程序·前端框架·node.js·html5
NoneCoder7 小时前
JavaScript系列(50)--编译器实现详解
开发语言·javascript·ecmascript
程序媛-徐师姐7 小时前
解决MacOS安装软件时提示“打不开xxx软件,因为Apple无法检查其是否包含恶意软件”的问题
macos·无法检查其是否包含恶意软件·打不开xxx软件
我命由我123457 小时前
脚本运行禁止:npm 无法加载文件,因为在此系统上禁止运行脚本
前端·javascript·前端框架·npm·node.js·html·js
杨荧10 小时前
【开源免费】基于Vue和SpringBoot的美食推荐商城(附论文)
前端·javascript·vue.js·spring boot·开源