macOS 10.14.5的Electron应用程序的通知过程

随着macOS 10.14.5的发布,Apple在分发应用程序之前为应用程序添加了强制性的公证流程。 我想告诉您它是什么,并且在Electron.js上进行开发时此更新引起了哪些困难。



引言


在Electron.js蓬勃发展2年之后,所有关于它的严重程度以及为什么需要它的热潮都是安静的。 我们不要在评论中重新点燃它们。 谢谢啦


我们的项目使用电子构建器来构建应用程序,但是对于电子包装器,此过程将大致相同。


该项目本身是用于云游戏的启动器,通过该启动器,本机客户端将启动以访问远程计算机。


用电子生成器签署应用程序看起来并不复杂,但是为了完整起见,我将简要介绍一下此过程。 如果对应用程序签名没有问题,则可以跳过本章。


应用程序签名


要签署该应用程序,我们需要从Apple开发人员的个人帐户中导出证书。 我们将需要:


  • 开发人员ID申请
  • 开发人员ID安装程序
  • *第三方Mac开发人员应用程序和第三方Mac开发人员安装程序(如果您打算在AppStore中发布该应用程序)

为特定的应用程序颁发了开发人员ID安装程序证书,因为此bundleID是必需的。 对于电子生成器,它由package.json中的appId参数指定



证书必须收集在一个文件中。 为此,将它们添加到钥匙串中(两次单击证书)。
然后,我们进入钥匙串,选择必要的证书,然后在上下文菜单中单击“导出项目”。 导出后,我们得到一个扩展名为.p12的文件。



在收到证书文件之后,将以下条目添加到环境变量中


  • CSC_LINK(证书文件.p12的路径)
  • CSC_KEY_PASSWORD(证书访问密码)

如果不添加这些变量,收集器将自动在钥匙串存储库中搜索合适的钥匙。 添加这些条目可让您查明要用于签名的证书。


完成这些操作后,您可以开始构建过程,一切应该顺利进行。


直到macOS 10.14.5发行为止,此工作一直很顺利....


macOS 10.14.5发生了什么变化


一个小题外话。 在晚上执行新补丁的最后工作时,我决定在早上离开生产版本的程序集。 注意到macOS上有更新,它启动并进入睡眠状态。


第二天早上,我很惊讶地看到在对应用程序进行签名时,该程序集因未知错误而掉线-“未经公证的开发人员ID”。


不要推迟到明天,今天可以做什么。 本杰明·富兰克林

问题的实质


从macOS 10.14.5开始,Apple引入了强制性的公证程序。 苹果公司有关此的第一篇文章是在2018年,但由于此更新,此程序成为强制性的。 她长什么样


您收集应用程序->将其发送到Apple服务器-> Apple对其进行认证->返回成功认证的状态->执行设置认证标记的命令。


对于使用Xcode的开发人员,您只需要勾选公证即可



而且,可以通过终端中的命令来执行组装的应用的公证处理。


$ xcrun altool --notarize-app --primary-bundle-id "com.example.ote.zip" --username "AC_USERNAME" --password "@keychain:AC_PASSWORD" --file OvernightTextEditor_11.6.8.zip 


如果您不执行公证程序,那么当用户尝试安装该应用程序时,会弹出带有错误的窗口。 Gatekeeper负责检查应用程序的安全性。 正是他打破了电子生成器上的应用程序组装。



电子生成器的构建过程看起来如何


在使用electronic-osx-sign实用程序在.app文件中构建应用程序之后,对该应用程序进行了签名。 使用证书签名后,启动了使用Gatekepper检查应用程序的过程。 但是随着更新的发布,网守开始检查应用程序的正确公证,这无法成功完成应用程序签名过程。



公证补丁


Github用户Kallin迅速提出了一种解决方案,在设置中增加了两个新参数。 第一个是“ gatekeeperAssess”-签名后禁用程序集验证,第二个是“ sign”-禁用带有证书的安装文件(dmg)的签名。 此提交包含在电子生成器20.43.0的发行版中。


对于公证过程本身,电子用户区具有一个执行此任务的电子公证模块,您只需要编写一个小脚本并使用afterSign挂钩运行它即可。


申请签名和公证流程



最初,您需要检查是否已经安装了electronic-builder版本> = 20.43.0,并安装了electronic-notarize软件包。


在环境变量中添加2个条目:


  • appleId-developer.apple.com登录
  • appleASP-“应用专用密码”,可以在您的个人帐户appleid.apple.com中创建。


现在创建一个公证脚本,将在对应用程序签名后执行。


 const notarize = require('electron-notarize').notarize; module.exports = async (context) => { const { electronPlatformName } = context; if (electronPlatformName === 'darwin') { try { console.log('Try notarize app'); await notarize({ appBundleId: 'APP_BUNDLE_ID', appPath: './dist/mac/APP_NAME.app', appleId: process.env.appleId, appleIdPassword: process.env.appleASP, }); console.log('Success notarize'); } catch (err) { console.log(err); } } }; 

我们将其保存在方便您的位置。


另外,为了进行适当的公证,我们需要确定访问权限
用于我们应用程序的系统资源。 为此,请创建文件build / entitlements.mac.inherit.plist


 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.security.cs.allow-jit</key> <true/> <key>com.apple.security.cs.allow-unsigned-executable-memory</key> <true/> <key>com.apple.security.cs.allow-dyld-environment-variables</key> <true/> <key>com.apple.security.cs.disable-library-validation</key> <true/> <key>com.apple.security.cs.disable-executable-page-protection</key> <true/> <key>com.apple.security.cs.debugger</key> <true/> <key>com.apple.security.automation.apple-events</key> <true/> </dict> </plist> 

在我的情况下文件的内容。 您可能有不同的配置。 所有字段的描述
Electron.js的必需项是-com.apple.security.cs.allow-unsigned-executable-memory。


现在更新package.json中的设置


在macOS的部分中:



  • gatekeeperAssess(禁用电子-osx-sign侧的应用程序验证)
  • hardenedRuntime(允许您创建安全权限列表和对系统资源的访问)
  • 权利(我们应用程序访问权限文件的路径)

在电子生成器设置的常规部分中:



  • afterSign(公证脚本的路径,将在对应用程序进行签名后启动)

我们开始组装过程。 似乎有点暂停,但是将文件传输到Apple服务器并等待响应需要一些时间(从3到10分钟)


可以通过以下命令在终端中查看通知状态:


$ xcrun altool --notarization-history 0 -u $appleId -p $appleASP


答案将显示在表格中。 状态字段的值可能为“处理”,“已批准”,“无效”



如果状态为“无效”,则可以通过请求号查看到底出了什么问题。


$ xcrun altool --notarization-info "RequestUUID" -u $appleId


这就是签名和公证的整个过程。 希望本文对您有所帮助。 谢谢啦


小加成


在转移应用程序进行测试时,发现了一个有趣的故障。 通过电报收到的应用程序只是拒绝启动。 查看日志时,发现该应用程序已被Telegram隔离。 由于什么原因以及如何发生,我找不到答案。 通过Yandex.Disk(或通过浏览器下载的任何其他方式)发送文件时,不会发生此问题。



有用的链接


Source: https://habr.com/ru/post/zh-CN455874/


All Articles