Electron打包的软件被苹果作为恶意软件拦截咋整?超详细图文解决记录,包会!

0 阅读7分钟

 Electronjs打包的桌面端软件被苹果作为恶意软件拦截,又出现了这个熟悉的提示框。

详细记录一下解决方案,简单来说就是需要苹果的安全证书认证和开发者账号的关联。

主要是解决过程很痛苦,苹果老美的风格你懂得,折腾了小半天,特别记录一下,也方便大家按图索骥,顺利解决问题。

原因分析:

主要的原因就是你打包好的应用没有经过苹果官方的恶意软件检测,没有给你打安全标签,所以用户打开的时候(你本机除外)就会报安全提示。

初看问题有点解释的不清楚,再看发现提示的其实挺准确,但是前提是你得懂这个过程。

详细解决方案:

废话说完,开始上解决方案。

1. 注册苹果开发者账号,并交钱(重点)

登录苹果开发者官网, developer.apple.com/ ,  建议用你的Apple ID注册登录(苹果的安全认证很严格,也是迎合欧美的隐私法案,所以新账号各种手机邮箱验证,还可能被拒绝,关键是没有理由的报错,你懂得)。

登录之后需要对账号进行认证,看下图。

认证的时候注意同一个身份证不能认证两个账号(对的,只是提示错误,需要联系客服才知道,要通过认证的话,理论上也不是不行,客服的原话是要有“充足且合理”的理由,懂的都懂,基本就是别想了)。

认证的时候如果图快就是个人账户认证,企业账户的话需要先通过邓白氏编码(嗯,又需要2周的等待,老美的办事效率就问你服不服)。

好了,网站到这基本就停了,别往下找了,认证完成这里就算完成了。

2. 前往Apple Developer交钱(别想了,逃不掉)

然后需要打开App Store下载这个Apple Developer应用,这个应用主要的作用就是,交钱,没错。

(提示下载的时候最好还是用科学上网, 否则你可能2个小时都是下载失败,别问我怎么知道的)

打开软件,用你刚才在苹果开发者网站上登录的账号登录,点击左下角的个人信息,在右侧可以看到订阅的信息(我的以团队为例).

按照规矩老老实实交完99美元,看到这个会员资格,恭喜你,就算是有资格进门来玩了。

3. 本地申请证书签名申请(是的,只是个申请)

过了前面两关,恭喜你,配置游戏就正式开始了。

回到你的本地Mac, 打开钥匙串(可以在聚焦搜索, Cmd+空格打开,搜索钥匙串,就是这货)。

打开之后就是你的证书和密钥管理。

然后注意这里,需要从菜单的“钥匙串访问”点开(没错,按钮就在菜单里,你就在界面上找吧),证书助理下面,从证书颁发机构请求证书。

这里打开之后选择“保存到本地”就可以了,这样最快。名字填你应用或者你的名字就可以。

然后就可以把"CertificateSigningRequest.certSigningRequest"这个证书请求文件保存到本地。

4. 从开发者网站获取公证证书

回到开发者网站,进入认证列表,我建议你从链接直接进去, developer.apple.com/account/res… , 这是一个找了10分钟入口,最后帮助文档的链接才进去的人的建议。

进去之后点击这个加号,创建你的证书。进去之后就是这样的,你可以根据自己的情况选,不知道咋选就选最下面这个Developer ID Application, 然后点击继续。

在这里把你刚才本地折腾的申请文件传上去, 点击继续,然后你就可以终于得到你的公钥证书了。名字是类似这个"developerID_application.cer"的cer文件。

双击它,就可以把它加载到你本地钥匙串的证书了。才可以继续下一步

5. 获取你的生成APP专用密码

进入苹果官网(是官网哦)account.apple.com/ , 再次登录(是的,又要登录,没事,慢慢就习惯了),找到这个,

点击之后,在点击这个+

输入一个名字(其实啥用没有,就是让你记住),创建

确认输入密码之后你终于可以得到你的App专用密码。现在就复制保存它,我到现在都没有见过他第二眼。

6. 配置开发环境

好了,恭喜你,到这一步,准备工作就算完成了。(都到这了,已经啥脾气没有了,再怎么都不着急了)

然后在你的环境中设置苹果认证的变量,建议放在~/.zshrc下面,方便后续应用的使用。

# 你的 Apple 账户登录邮箱
export APPLE_ID="your_email@apple.com"
# 刚才在 account.apple.com 生成的 16 位 App 专用密码
export APPLE_APP_SPECIFIC_PASSWORD="abcd-efgh-ijkl-mnop"
# 你的 Team ID (登录苹果开发者后台,在右上角你的名字旁边有个 10 位的字母数字组合,例如 AB12CD34EF)
export APPLE_TEAM_ID="AB12CD34E"

"APPLE_APP_SPECIFIC_PASSWORD"就是你刚才最后折腾的那个App专用密码。

你的Team ID (如果是企业认证的话),可以在苹果开发者网站上的会员信息中看到,

7. 配置electron

现在的electron-builder都可以直接认证打包了(笔者的版本是26.8),打开package.json文件。

在build字段下这么配置

"build": {
    "appId": "com.riyuexinzhu.claw_assistant",
    "productName": "仙踪·龙虾助手",
    "directories": {
      "buildResources": "resources",
      "output": "dist"
    },
    "files": [
      "build/**/*",
      "electron/**/*",
      "resources/**/*",
      "configs/**/*",
      "common_shared/**/*",
      "node_modules/**/*"
    ],
    "mac": {
      "target": "dmg",
      "category": "public.app-category.utilities",
      "icon": "public/app_logo.png",
      "hardenedRuntime": true, 
      "entitlements": "resources/apple/entitlements.mac.plist",
      "entitlementsInherit": "resources/apple/entitlements.mac.plist",
      "notarize": true 
    },
    "dmg": {
      "sign": false
    }
  }

主要看mac下面的字段。

hardenedRuntime: true:必须开启(强化运行时),这是苹果公证的前置硬性要求。

notarize: true:告诉 ****electron-builder ****在签名完成后自动调用苹果的公证服务。它会自动读取你

刚才设置的 ****APPLE_IDAPPLE_APP_SPECIFIC_PASSWORD ****和 APPLE_ TEAM_ID ****环境变量。

dmg: { sign: false } :通常不对外层的 dmg 容器进行二次深度签名,避免公证时出现校验冲突

(主要公证内部的 ****.app ****即可)。

  1. 配置entitlements.mac.plist ****权限文件

笔者是放在resource目录下(以项目根目录为基准)

<?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>
    <!-- 允许 Electron 使用 JIT 编译执行 JS,没有这个会导致 Electron 启动崩溃 -->
    <key>com.apple.security.cs.allow-jit</key>
    <true/>
    <!-- 允许使用未签名的可执行内存,V8 引擎必需 -->
    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
    <true/>
    <!-- 允许调用动态链接库 -->
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
    <!-- 允许发送 Apple Events(使用 sudo-prompt 弹出验证框依赖 osascript,必须开启此项) -->
    <key>com.apple.security.automation.apple-events</key>
    <true/>
  </dict>
</plist>

由于我在应用中使用了sudo, 所以需要最后一项com.apple.security.automation.apple-events的配置。

8. 构建

恭喜你,马上就要胜利了。

现在你终于可以进行构建了,运行yarn build:app, (具体取决于你的package.json中的对应名字)

看到signing就是在把你的应用包送到苹果检测是否有恶意软件,需要点时间,如果可以科学上网还是建议你打开的(记得需要在命令行中export http生效),否则可能等个把小时都没动静(别问我怎么知道的)。

验证没有问题之后,看到下面notarization就是你的应用打安全标签了。

到这里就算大功告成了!

这一套下来,就问你苹果的安全机制服不服,不光防坏人,更防自己的开发人员。

祝大家保持好的心态,今天就到这里了。保持心脑血管健康,活着最重要!