electronr进行签名与公证
windows:
1.设置package.json的有关window打包的相关内容
"win": {
"icon": "build/icons/icon.ico",
"target": [
{
"target": "nsis",
"arch": [
"x64",
"ia32"
]
}
],
"verifyUpdateCodeSignature": false,
"signingHashAlgorithms": [
"sha256",
"sha1"
],
"signDlls": true,
"rfc3161TimeStampServer": "http://timestamp.digicert.com",
"certificateFile": "xxx.pfx",
"certificatePassword": "xxxxxx"
},
主要参数说明:
'arch:代表需要打包的位数,win64代表打包64位的,ia32代表打包32位的,最好分开打包,因为一起打包的话最后出来的包是正常开发包的两倍。
'signingHashAlgorithms':代表加密的方式,一般分为'sha256'与'sha1'两种方式,都进行加密即可。
'rfc3161TimeStampServer':代表时间戳,一般使用'http://timestamp.digicert.com'来进行时间戳的覆盖即可
'certificateFile':证书的地址,必须位pfx格式(如何导出会在第二步的时候进行讲解)
'certificatePassword':证书的私钥密码,这个在配置证书的时候进行设置(第二步进行讲解)
2.导出pfx格式的证书
windows的证书需要去有相关资质的商家进行购买,我是在数安时代购买的,现在买的证书都是以签名狗(类似与银行的u盘)的方式进行发放,确保了安全性的问题。在插上签名狗的时候,会自动下载一个证书管理工具软件,在上面可以可以修改密码,即上面第一步certificatePassword参数的值。
问题:
但是有个最大的问题就是,无法进行导出pfx证书,只能导出cer格式的不带私钥的证书。它可以对已经打包完的exe进行签名,很明显这对electron来说是不合适的。对打包完的exe进行签名,会导致无法升级的问题,所以需要在打包的时候就将证书打进去。
解决方法:
打开数安时代的软件(本地未插签名狗,如果插入,此地会出现购买的证书),右键证书,导出cer格式的证书,然后修改后缀名为pfx,如导出的为test.cer,修改后缀名为test.pfx,放到项目的根目录下面,第一步的certificateFile修改为'test.pfx'即可(当然,test只是个例子,名字自定义)
3.进行打包
这个时候,windows上的签名已经可以了,运行你的打包命令吧!
npm run build
由于我们导出的是不带私钥的pfx证书,所以在打包过程中会弹出弹窗提示你需要输入密码,输入你在第二步的密码即可。全程中不能拔下来你的签名狗,不然签名会断开。
运行成功之后,在你的打包出来的exe上进行右击属性,即可看到签名成功:
macOS:
1.制作本地CSR文件:
首先你得需要一个appleId的账号,登陆在你的mac上,然后进入钥匙串访问(在启动台打开),打开证书助理--->从证书办法机构请求证书
这个时候会出现证书助理的弹窗,选择存储到U盘,输入自己常用的email地址即可,点击继续
最后会生成一个CSR的文件,这个文件就是我们接下来需要的东西,我把它放到了桌面
2.生成Developer ID Application证书
登陆 https://developer.apple.com/account/resources/certificates/add 这个地址,然后生成你的Developer ID Application证书 ;
首先点击Certificates,选择添加
选择Developer ID Application类型的证书,这里需要注意的是,electron打包的桌面应用必须试用这个证书。
然后开始选择CSR文件,就是第一步导出的文件
导入完毕之后,你就可以看到自己生成证书的信息了,黄色箭头指向的信息为提示14.10.5以及以上系统需要去公证,公证的步骤下面说,最后点击下载即可:
3.将生成的证书导入到钥匙串中
点击证书,自动添加到了钥匙串中,在钥匙串中进行访问:
右击,查看详情,然后设置信任为始终信任:
至此,证书在钥匙串里面已经设置完毕,导出为p12文件
导出文件的路径要记住,因为我们下一步设置环境变量需要用到
4.生成Identifiers,获取BundleId
点击网址左侧的Identifiers选项,进行添加
选择App ID进行添加
这个时候会让你自定义名称,按照他的提示自定义一下,如 com.mac.test,这个要记住,因为后面我们要用它来配置package.json
5.配置环境变量
如果不配置环境变量的话,在mac是electron是无法获取到本地的证书的,所以,打开你的终端(mac的终端命令和LINUX很相似)
输入:
sudo vim ~/.bash_profile
进入配置环境变量;
继续输入:
export CSC_LINK = ~/zs/mac.p12
这行命令是为了寻找你的p12证书,然后加入到环境变量中,zs/mac.p12为第三步导出的证书的绝对地址
然后按键盘上的esc建进行退出;
在终端上继续输入:
:qw
source ~/.bash_profile
进行重载环境变量
输入
env
查看环境变量配置的结果:
注意:如果配置完成之后,多次重载都发现环境变量不能正确更新到列表中,这时应该先退出终端,然后再登录终端查看环境变量即可看到更新完成。
6.进行公证
其实到第五步,运行命令
npm run build
是没有任何问题的,也是可以进行升级的操作。(这个地方记得要把app拖到Applications中之后,再在程序坞中打开,不然无法进行升级)
注意:通过钥匙串的方式进行代码签名,进而实现自动更新之后,appId应一致,打包应用后不能随意更改新的appId字段。否则会被认为是两个不同的应用而无法更新。
但是从MacOS 10.14.5开始,所有“新”开发人员签名的App都需要进行公证(Notarization),否则将触发苹果的Gatekeeper,阻止用户安装你的App。这意味着,除了对 App 进行签名,还需要对其进行公证。如果你尝试启动应在MacOS 10.14.5上未经公证的Appp,则会看到以下的错误消息:
这是因为mac为了保证安全,对除App Store以外的应用进行公证,以确保没有恶意代码,相关内容在这里:https://support.apple.com/zh-cn/HT202491?_blank
官方文档给的方法是用xcode提交到苹果的公证处进行公证,但是这方法对于electron来说是不合理的,electron所做的是打包的时候就把一切问题解决了,所以,还是需要在打包的根源上寻找解决方法:
1.安装electron-notarize
运行命令:
npm i electron-notarize --save-dev
2.使用hardened runtime构建App
在添加公证时,苹果偷偷加入了一项要求,即App的 runtime 必须是 hardened runtime ,这在默认情况下会减少应用程序的权限。这不一定是坏事,但还有一件事需要考虑。
在一个 hardened runtime 中App需要两件事:
- 在 electron-builder的 mac配置选项中设置 "hardenedRuntime": true ;
- 设定正确的权限。
如果运行 hardened runtime 时,则至少设置一个非常重要的权限:“allow-unsigned-executable-memory”。您可以在此处指定更多权限,但这是Electron App所需的唯一权限。我在public文件夹下新建名为entitlemets.mac.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-unsigned-executable-memory</key>
<true/>
</dict>
</plist>
在 electron-builder的 mac
配置选项中,需要将entitlements
和entitlementsInherits
的值同时设置为上述文件的路径。通过entitlementsInherits
这个配置可以授予Electron在内部访问权限文件时相同的权限。
"mac": {
"entitlements": "build/entitlements.mac.plist",
"entitlementsInherit": "build/entitlements.mac.plist"
},
3.使用有效的开发者ID进行签名
只有当你的 Mac上安装了有效的开发人员ID时,才能对App进行公证。Electron-bulder将自动从钥匙串中获取一个有效 ID 进行签名。这就需要你有一个Apple的开发者账号。关于这一点,不再赘述。
但是,electron-builder使用的签名工具(electronic -osx-sign)会进行完整性检查以验证签名是否成功。在MacOS 10.14.5之前,这个完整性检查将返回True,但在MacOS 10.14.5 中,它会返回False。因为虽然签名进行完毕了,但应用程序还没有公证信息,所以会返回错False。
所以我们需要禁用这种完整性检查。你可以通过在electron-builder的mac配置中设置“gatekeeperAssess”:false来实现。
最后,我们来看下 mac 参数的配置情况吧:
"mac": {
"hardenedRuntime" : true,
"gatekeeperAssess": false,
"entitlements": "build/entitlements.mac.plist",
"entitlementsInherit": "build/entitlements.mac.plist"
},
4. 使用electron-notarize
公证App
接下来则是关于公证的部分。我们使用的工具叫 Electron-notarize 。因为只需要在开发阶段使用,因此请将其安装到 devDependency。
这个工具可以完成公证的所有工作:将App打包并上传到Apple的服务器,等待公证成功,然后给App加入公证信息。这些流程是异步发送的,构建过程会增多不少时间。
App应该在签名之后,打包成DMG之前进行公证。Electron-builder 有一个afterSign的钩子,通过执行对应的 js 文件。这个配置选项在“build”配置中。
"build": {
"afterSign": "scripts/notarize.js"
}
notarize.js代码如下:
const { notarize } = require('electron-notarize'); exports.default = async function notarizing(context) {
const { electronPlatformName, appOutDir } = context;
if (electronPlatformName !== 'darwin') {
return;
} const appName = context.packager.appInfo.productFilename; return await notarize({
appBundleId: 'com.yourcompany.yourAppId',
appPath: `${appOutDir}/${appName}.app`,
appleId: '',
appleIdPassword: '',
});
}
我们只需要签署MacOS,所以如果我们不在darwin(macOS的内部名称)上,我们返回并且不运行公证代码。
为了更好的安全性,请考虑使用此处概述的MacOS钥匙串:使用appleIdPassword时的安全性。
说到用户凭证。这是您的Apple ID,但是您需要生成一个特定于应用程序的密码(所以不要使用常规密码!)你可以在appleid.apple.com上创建一个。
5. 不要对dmg签名
在版本20.43.0之前,electronic -builder还签署了您的DMG安装程序。这实际上不是一个问题,但是在新的公证规则下,任何签署的东西都需要公证。
但是,如果对DMG安装包签名并公证,它实际上会触发之前看到的错误。这可能是 Apple 审核逻辑中的一个错误。既然这个错误存在,我们必须要使用未经过公证的DMG文件。Apple的Gatekeeper可以检测到DMG中的经过公证的.app文件,并且可以让用户正常打开App。
从electronic -builder 20.43.0开始,默认情况下DMG是无签名的。您可以通过在“dmg”配置中添加“sign”:false来显式地处理这种行为:
"dmg": {
"sign": false
},
看一下最终的配置信息:
"build": {
"afterSign": "scripts/notarize.js",
"productName": "",
"appId": "******",
"directories": {
"output": "build"
},
"publish": [
{
"provider": "generic",
"url": "******"
}
],
"files": [
"dist/electron/**/*"
],
"dmg": {
"sign": false,
"contents": [
{
"x": 410,
"y": 150,
"type": "link",
"path": "/Applications"
},
{
"x": 130,
"y": 150,
"type": "file"
}
]
},
"mac": {
"hardenedRuntime": true,
"gatekeeperAssess": false,
"entitlements": "build/entitlements.mac.plist",
"entitlementsInherit": "build/entitlements.mac.plist",
"icon": "build/icons/icon.icns"
},
"win": {
"icon": "build/icons/icon.ico",
"target": [
{
"target": "nsis",
"arch": [
"ia32"
]
}
],
"verifyUpdateCodeSignature": false,
"signingHashAlgorithms": [
"sha256",
"sha1"
],
"signDlls": true,
"rfc3161TimeStampServer": "http://timestamp.digicert.com",
"certificateFile": "sa.pfx",
"certificatePassword": "Sp123456"
},
"linux": {
"icon": "build/icons"
},
"nsis": {
"perMachine": false,
"oneClick": false,
"allowElevation": true,
"allowToChangeInstallationDirectory": true,
"installerIcon": "build/icons/icon.ico",
"uninstallerIcon": "build/icons/icon.ico",
"installerHeaderIcon": "build/icons/icon.ico",
"createDesktopShortcut": true,
"createStartMenuShortcut": true
}
}
如果,在公证的时候出现了这个报错:
electron you must first sign the relevant contracts online
那你需要到你申请appid的网站上进行登陆一下,有个协议,同意一下即可。
如此,mac和window的签名以及公证就全部完毕了。
electronr进行签名与公证的更多相关文章
- Mac Electron 应用的签名(signature)和公证(notarization)
背景 在MacOS 10.15之前,应用如果没有签名,那么首次打开时就会弹出这种“恶意软件”的提示框. 这时只要应用签名了,就不会弹这个框. 但在MacOS 10.14.5之后,应用如果没有公证(简单 ...
- NW.js Mac App 签名公证流程
使用 Developer ID 为 Mac 软件签名 - Apple Developer 在MacOS 10.15之前,应用如果没有签名(signature),那么首次打开时就会弹出"无法验 ...
- 关于OSS不再维护的一些讨论
FUSE for macOS 将不再维护 Fuse 是一款针对Mac OS的文件系统所开发的一款开源软件. 用于MacOS的FUSE软件包提供了多个API,用于为OS X 10.9至macOS 10. ...
- .NET 6 史上最全攻略
欢迎使用.NET 6.今天的版本是.NET 团队和社区一年多努力的结果.C# 10 和F# 6 提供了语言改进,使您的代码更简单.更好.性能大幅提升,我们已经看到微软降低了托管云服务的成本..NET ...
- MacOS命令行打包+签名+公证+生成dmg文件
关于dmg文件是什么,和为什么要进行公证? 简单说下,dmg文件就是一个可直接在mac上安装的安装包,我自己的理解是就像windows上的exe安装包一样: 公证是将app传到苹果商店去做认证,如果不 ...
- java-信息安全(十八)java加密解密,签名等总结
一.基本概念 加密: 密码常用术语: 明文,密文,加密,加密算法,加密秘钥,解密,解密算法,解密秘钥, 密码分析:分析密文从而推断出明文或秘钥的过程 主动攻击:入侵密码系统,采用伪造,修改,删除等手段 ...
- Akka-CQRS(13)- SSL/TLS for gRPC and HTTPS:自签名证书产生和使用
到现在,我们已经完成了POS平台和前端的网络集成.不过,还是那句话:平台系统的网络安全是至关重要的.前一篇博客里我们尝试实现了gRPC ssl/tls网络连接,但测试时用的证书如何产生始终没有搞清楚. ...
- 阿里签名中URLEncode于C#URLEncod不同之处
问题 如上图所示,阿里云的PercentEncode 转换! 为 %21 PercentEncode 源码为: package com.aliyuncs.auth; import java.io.Un ...
- Gradle配置APK自动签名完整流程
转载请注明出处:http://www.cnblogs.com/LT5505/p/6256683.html 一.生成签名 1.命令行生成签名,输入命令keytool -genkey -v -keysto ...
随机推荐
- 多线程之美2一ThreadLocal源代码分析
目录结构 1.应用场景及作用 2.结构关系 2.1.三者关系类图 2.2.ThreadLocalMap结构图 2.3. 内存引用关系 2.4.存在内存泄漏原因 3.源码分析 3.1.重要代码片段 3. ...
- 【CV现状-2】三维感知
#磨染的初心--计算机视觉的现状 [这一系列文章是关于计算机视觉的反思,希望能引起一些人的共鸣.可以随意传播,随意喷.所涉及的内容过多,将按如下内容划分章节.已经完成的会逐渐加上链接.] 缘起 三维感 ...
- C#线程学习笔记十:async & await入门三
一.Task.Yield Task.Yield简单来说就是创建时就已经完成的Task,或者说执行时间为0的Task,或者说是空任务,也就是在创建时就将Task的IsCompeted值设置为0. 我们知 ...
- centos7 nginx 配置
1.下载nginx 官方下载1.6.2 2.编译安装 [root@bogon nginx-1.6.2]# ./configure --prefix=/usr/local/webserver/nginx ...
- linux中批量添加文件前缀的操作
需要在文件夹内所有txt文件的文件名前面添加"gt_"; 就是由原来的文件“xxx.txt”变成“gt_xxx.txt”: 网上搜来的脚本如下: for i in `ls`; do ...
- 数据结构学习--双向链表(python)
概念 双向链表(Double_linked_list)也叫双链表,是链表的一种,它的每个数据结点中都有 两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可 以很方便地访问 ...
- IT兄弟连 HTML5教程 CSS3属性特效 小结及习题
本章小结 CSS3新增了许多属性,CSS3样式新增了一种颜色模式rgba用来制作透明色,比CSS的颜色模式多了一个透明度的设置.文字的CSS3特效有文字阴影.文字描边.文字排版和文字省略等.另外,CS ...
- CSS雪碧图(精灵图)使用
1:CSS雪碧图:CSS雪碧图 即 CSS Sprites,也有人叫它CSS精灵图. 2:雪碧图的由来:一个网站的页面需要大量的小图片或者小图标,但是大量的图片如果放在服务器上,每次当打开网站并且向服 ...
- golang 安装脚本
#!/bin/bash env sudo yum -y install wget curl echo "download golang ..." # 获取最新的golangurl ...
- dedecmsV5.7 任意文件上传漏洞修复
问题文件:在/include/dialog/select_soft_post.php文件 解决方法: 先找到这个文件/include/dialog/select_soft_post.php,找到大概7 ...