Linux打包签名

概述

常见的Linux桌面系统有Fedora、Ubuntu,以及统信USO、Deepin等国产系统。Linux中主流的软件包有debrpm两种格式;其中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(如:fschild_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
举报

© 著作权归作者所有


0