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_ID、APPLE_APP_SPECIFIC_PASSWORD ****和 APPLE_ TEAM_ID ****环境变量。
dmg: { sign: false } :通常不对外层的 dmg 容器进行二次深度签名,避免公证时出现校验冲突
(主要公证内部的 ****.app ****即可)。
- 配置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就是你的应用打安全标签了。
到这里就算大功告成了!
这一套下来,就问你苹果的安全机制服不服,不光防坏人,更防自己的开发人员。
祝大家保持好的心态,今天就到这里了。保持心脑血管健康,活着最重要!