为Electron创建代码签名证书并集成到NSIS安装包解决未知发布者错误
首先明确前置说明:你遇到的unknown publisher报错是Windows系统对未签名可执行程序的默认安全提示。你生成的自签名证书仅适合内部测试场景使用,若要对外发布应用,需使用受微软信任的CA机构颁发的正规代码签名证书,自签名证书默认不会被系统信任,用户需手动导入证书到受信任根目录才会消除提示。
问题1:如何配置CSC_LINK和CSC_KEY_PASSWORD?是否需要添加到package.json?
绝对不要将这两个参数写入package.json,CSC_KEY_PASSWORD属于敏感信息,提交到代码仓库会导致证书密钥泄露。二者为electron-builder识别的环境变量,配置方式分两种场景:
- 本地构建:运行构建命令前先临时设置环境变量即可。Windows cmd环境执行
set CSC_LINK=你的.pfx文件本地路径、set CSC_KEY_PASSWORD=生成证书时设置的密码,再执行构建命令;Mac/Linux终端执行export CSC_LINK=你的.pfx文件本地路径、export CSC_KEY_PASSWORD=生成证书时设置的密码,再执行构建命令。 - 构建服务器构建:直接在对应CI/CD平台的环境变量配置面板添加两个参数即可,主流平台均支持加密存储敏感环境变量,不会明文泄露。
问题2:导出证书操作具体如何完成?是否只需上传到构建服务器即可?
你通过electron-builder create-self-signed-cert命令生成的.pfx文件本身就是已经导出完成的证书文件,无需额外执行导出操作。
如果你是通过Windows证书管理器生成的自签名证书,才需要手动导出:运行certmgr.msc打开证书管理器,在「个人-证书」分类下找到你生成的证书,右键选择「所有任务>导出」,按向导指引选择导出私钥、设置保护密码,最终生成.pfx格式文件即可。
若使用构建服务器构建,你可以直接将.pfx文件上传到服务器的安全存储路径,也可以使用base64编码后的字符串配置环境变量,无需上传源文件。
问题3:base64编码步骤应该在证书上传前还是后执行?是否是将.pfx转为文本格式?
base64编码需要在上传前执行,本质就是将二进制格式的.pfx证书转换为纯文本字符串,好处是无需在构建服务器存储二进制证书文件,直接将转换后的字符串赋值给CSC_LINK即可,electron-builder会自动识别base64格式的证书内容并解码使用。
不同系统的转换命令:
- Windows:执行
certutil -encode 你的证书文件名.pfx base64_output.txt,打开输出的txt文件,删除头尾的标注行和所有换行符,拼接后的完整字符串即可使用。 - Mac/Linux:执行
base64 -i 你的证书文件名.pfx | tr -d '\n',直接输出可用的base64字符串。
问题4:将.pfx附加到NSIS安装包更好,还是通过服务器处理签名更合理?
绝对禁止将.pfx证书文件打包到NSIS安装包内,.pfx文件包含你的证书私钥和密码,一旦被人从安装包中提取,会被冒用签名恶意程序,存在极高安全风险。
正确的流程是在构建服务器的构建环节先完成应用签名,再生成最终的NSIS安装包,证书文件或base64编码仅存储在构建服务器的加密环境变量中,不会对外泄露。
内容的提问来源于stack exchange,提问作者Elias Khazzaka

