Linux打包签名
概述
常见的Linux桌面系统有Fedora、Ubuntu,以及统信USO、Deepin等国产系统。Linux中主流的软件包有deb
和rpm
两种格式;其中deb
适用于Debian、Ubuntu等,rpm
适用于CentOS、Fedora、OpenSUSE等;但对于桌面级Linux系统,还可以使用AppImage
格式包。
AppImage
包和rpm
包都无法直接双击安装,安装必须先赋予执行权限;尤其是AppImage
包,其能否安装成功完全依赖于当前系统是否有相关的依赖软件;但deb
包可直接双击安装;
在linux中,deb
包是为系统安装而设计的,deb
包默认都会安装到 /opt
目录下 ;因为 /opt
是一个系统目录,只有 root 用户有写权限;因此deb
包安装的electron应用在运行时是无法对文件进行写或赋予执行权限的。
综上,在Linux中没有完美的打包方式,最终借鉴vs code打包成.deb
和.rpm
;并在软件首次启动时,将需要执行或写入的文件复制到用户目录下;复制到用户目录下以后,就可以进行任意操作。electron应用默认安装在/opt
等系统目录下,该目录普通用户无法写入;如果强制通过chmod
命令修改/opt
系统目录下的文件权限,会破坏系统安全规范,可能被系统安全策略阻止,会造成很多不稳定因素。借鉴vscode,将electron应用中需要写入和执行的文件复制到用户目录下,再进行任意操作。例如在用户目录创建文件夹 ~/.sidoc-desktop-frp/
,并在该文件夹中放置所有需要写入和执行的文件;.sidoc-desktop-frp
是一个隐藏目录,此举借鉴自vscode和其它应用,例如:~/.vscode/
。
关于软件安装
现代操作系统都实行“安装目录只读,用户目录可写”的原则;即,无论哪个用户安装的软件,安装目录的属主都是管理员;软件运行过程中的所有数据文件全部存储在用户数据目录下。以Linux为例,多数桌面级软件只能在普通用户名下安装运行,且安装目录在root名下,并作为被保护目录、执行最小权限原则,软件运行过程中没有权限对安装目录进行修改。如果强行通过root修改安装目录的属主,使软件在运行过程能够修改和操作安装目录,那系统可能会给出警告,甚至阻止软件的某些行为,因为这是危险行为,严重违反了系统安全规范。将软件运行过程中的所有数据文件存储在用户数据目录下,不仅能避免修改安装目录,还能实现多用户的数据隔离。
软件在运行过程中可以修改、写入和执行用户数据目录下的文件,但被执行的文件必须拷贝自安装目录;不能从互联网上下载一个可执行文件来运行,否则系统可能会给出警告或阻止;因为安装目录下的可执行文件是被用户授权安装的,而从互联网下载的可执行文件没有被用户授权安装,因此不能运行;否则系统会怀疑软件在偷摸执行后台程序;在欧洲或某些国家,这种偷摸下载、运行可执行文件的行为是违法的。 主流操作的用户数据目录如下图:
常用问题
1>. 在Ubuntu中双击deb
安装包,无法弹出安装界面时,可通过命令进行安装;如下命令安装时会显示安装过程中的错误,这些错误可能就是无法弹出安装界面的原因:
sudo dpkg -i /path/to/your-package.deb
2> 在Ubuntu中,.desktop
启动器文件在 /usr/share/applications
目录下;
3> 关闭沙盒:为了提高软件在Linux系统中的兼容性,需要在软件的启动命令上加如下参数,以禁用沙盒和GPU;
## 如下配置项 electron-build 配置文件中
"executableArgs": ["--no-sandbox", "--disable-gpu"]
Linux系统的软件签名
Linux系统的软件包签名是免费的;AppImage包签名后可发布到AppImageHub或Linux应用商店,以提高应用的曝光率、增强可信度。GPG 是 Linux 生态的标准签名工具,可在 electron-builder 项目中进行配置,以便打包时直接进行签名。
关于沙箱机制
Electron 默认启用了 Chromium
的沙箱机制,用于隔离进程以提升electron应用的安全性;以避免渲染进程直接调用 Node.js 的底层 API(如:fs
、child_process
),导致恶意代码执行系统命令、读写文件等危险操作;如:require('child_process').exec('rm -rf /');
多数Linux不允许软件在root下以沙箱模式启动,因此对于Electron应用,任何情况下都不应该在root用户下启动;当然,在Linux系统中,所有日常应用本就应该在非root用户下运行,root仅用于执行某些高级操作。
最佳实践是在打包时对eletron应用进行配置,以便用户在安装electron应用后自动执行如下命令,以启用沙盒:
sudo chown root:root chrome-sandbox
sudo chmod 4755 chrome-sandbox ## 设置 setuid 位
但electron应用的沙盒依赖于 setuid
机制来实现,如果linux系统环境本身禁用了 setuid
或没有安装chromium-sandbox,则无论执行什么命令都无法启用沙盒。
如下图所示,大厂开发的Electron应用基本都禁用沙盒,以提升兼容性:
综上,为了提升应用的兼容性,推荐在Eletron应用中关闭沙盒。
安装deb和rpm包
如果打包为deb和rpm格式,则可按如下方式安装,不同Linux的安装方式可能略有差异;
0.1> 在Fedora桌面系统中安装rpm包 -----------------------------------------------------------------------
## 切到root用户
sudo -i
## 增加执行权限
sudo chmod +x package.rpm
## 安装软件
sudo dnf install package.rpm
## 卸载软件
sudo rpm -e package
0.2> 在Ubuntu桌面系统中安装deb包 -----------------------------------------------------------------------
## 直接双击安装即可,但可能因为沙盒权限问题而无法启动,因此要用如下命令以临时关闭沙盒的方式启动
sidoc-frp-desktop --no-sandbox