Skip to content

在 Linux 上使用云签工具进行代码签名 ​

适用于已开通 TrustAsia 云签服务,需要在 Linux 主机上使用 ssigncode 为 Windows EXE 文件签名的用户。整个流程为:准备工具和签名信息 → 安装操作员证书 → 查询操作员指纹 → 签名并添加时间戳 → 检查结果。

本文以 v4.6.16-2-g61ad30c 为例。原操作指南记录该版本在 Linux x86_64、glibc 2.34 环境通过了安装、签名和时间戳验证;这一记录不代表其他系统环境均已验证,也不代表必须使用完全相同的版本。请使用与主机架构及运行环境匹配的 Linux 工具。

1. 使用前准备 ​

开始前,请确认云签订单中的代码签名证书已签发,并获取 Linux 版 ssigncode 工具。工具安装包和对应环境配置可向技术支持或平台管理员获取。

设置 PIN 并获取安装 token ​

  1. 进入目标订单的 云签详情 → 签名安全设置,设置签名 PIN;已设置过的使用当前 PIN。
  2. 在 云签详情 → 操作员管理 中点击“添加”。
  3. 复制新增操作员记录中的安装 token,供后续安装证书使用。

云签详情中的签名安全设置和 PIN 设置入口

在操作员管理中添加操作员并复制安装 token

获取签名证书指纹 ​

进入目标代码签名证书的 订单详情 → 证书详情,复制“指纹”字段,并核对所属组织和有效期。

证书详情中指纹字段的位置

信息用途
Linux 版 ssigncode执行操作员安装、签名和时间戳命令。
签名服务器地址统一使用 https://vsign.trustasia.com,对应 -s。
操作员安装 token安装操作员证书,对应 --auth。
签名 PIN在签名安全设置中设置,对应 --key_pin。
签名证书指纹指定用于签署文件的代码签名证书,对应 --cert_hash。
证书来源对应 --cert_from,按本次 Linux 工具及服务环境的交付配置填写。
待签名文件本文以 Windows EXE 文件为例。

Linux 主机需要能够访问签名服务及所选时间戳服务。本文的命令使用 Bash,查询证书信息需要 OpenSSL。安装和后续签名建议使用同一个 Linux 账户。

安装 token、操作员证书指纹和签名证书指纹用途不同。本文中的证书 Hash 即证书指纹;--hash sha256 则表示文件签名使用的摘要算法。

下文使用 <签名工具所在目录>、<待签名EXE文件的完整路径> 等占位示例。执行前请将尖括号及其中内容整体替换为实际值,并保留路径外侧的引号。

2. 检查工具并设置参数 ​

本文命令在 Bash 中执行。进入工具所在目录,添加执行权限并检查版本:

bash
cd '<签名工具所在目录>'
chmod u+x ./ssigncode
./ssigncode version

在当前 Bash 会话中配置服务及文件路径:

bash
VSIGN_SERVER='https://vsign.trustasia.com'
VSIGN_CERT_FROM='<管理员提供的证书来源>'
VSIGN_CERT_HASH='<签名证书指纹>'
VSIGN_INPUT='<待签名EXE文件的完整路径>'

VSIGN_SERVER 统一使用 https://vsign.trustasia.com。VSIGN_CERT_FROM 按交付配置填写,操作员与签名证书使用对应云签订单中的信息。

查看当前工具支持的参数:

bash
./ssigncode install --help
./ssigncode vsign --help

上述变量仅在当前会话中有效;重新打开终端后,需要重新设置并进入工具目录。

3. 安装操作员证书 ​

首次使用时安装操作员证书。已安装且可正常使用的操作员,可直接进入下一节查询指纹。

以下命令以隐藏输入方式读取 token 和 PIN:

bash
read -rsp '请输入安装 token: ' VSIGN_TOKEN; printf '\n'
read -rsp '请输入 PIN: ' VSIGN_PIN; printf '\n'
./ssigncode install --vsign --auth "$VSIGN_TOKEN" --key_pin "$VSIGN_PIN" -s "$VSIGN_SERVER"
install_rc=$?
unset VSIGN_TOKEN
printf '安装退出码:%s\n' "$install_rc"

成功时可看到:

text
获取操作员证书成功
安装操作员证书成功

成功退出码应为 0。如果安装失败,先处理错误,再继续签名;需要重新获取安装 token 时,请联系管理员。

4. 查询操作员证书指纹 ​

安装后可在 云签详情 → 操作员管理 → 证书哈希 中查看操作员证书指纹。Linux 签名时还需确认对应证书已安装到当前账户。

操作员管理中的证书哈希字段

本文适用版本将证书保存在安装用户主目录下的 .ssigncode 目录中。使用安装时的 Linux 账户执行以下命令,查询本机证书名称、有效期及 SHA1 指纹:

bash
for cert in "$HOME"/.ssigncode/*.pem; do
  [ -f "$cert" ] || continue
  openssl x509 -in "$cert" -noout -subject -dates -fingerprint -sha1
done

根据 subject 选择目标操作员,将对应 sha1 Fingerprint 后面的指纹去掉冒号,填入变量:

bash
VSIGN_OPERATOR_HASH='<已安装操作员证书的SHA1指纹,不含冒号>'

如未显示任何证书,请确认安装是否成功,以及当前账户是否与安装时一致。签名时以本机实际安装证书的指纹为准;重新安装后应再次查询,不要直接沿用旧指纹。

5. 签名并添加时间戳 ​

确认输入文件存在:

bash
ls -l "$VSIGN_INPUT"

若本次会话尚未输入 PIN,请先执行:

bash
read -rsp '请输入 PIN: ' VSIGN_PIN; printf '\n'

在当前目录创建独立输出目录,然后签名:

bash
VSIGN_OUT_DIR=$(mktemp -d "$PWD/vsign-output-XXXXXX")
if [ -n "$VSIGN_OUT_DIR" ] && [ -d "$VSIGN_OUT_DIR" ]; then
  ./ssigncode vsign \
    -s "$VSIGN_SERVER" \
    --cert_from "$VSIGN_CERT_FROM" \
    --cert_hash "$VSIGN_CERT_HASH" \
    -u "$VSIGN_OPERATOR_HASH" \
    --key_pin "$VSIGN_PIN" \
    -i "$VSIGN_INPUT" \
    -o "$VSIGN_OUT_DIR/signed.exe" \
    --hash sha256 \
    --ts TrustAsia
  sign_rc=$?
else
  printf '无法创建输出目录,请检查当前目录的写入权限。\n'
  sign_rc=1
fi
printf '签名退出码:%s\n输出文件:%s\n' "$sign_rc" "$VSIGN_OUT_DIR/signed.exe"

当前目录需具备写入权限。输出文件与原始输入使用不同路径,便于检查本次生成的结果。

成功时可看到:

text
vsign>开始签名, 读取文件
vsign>发送文件摘要,进行签名...
vsign>附加时间戳...
vsign>签名成功!

主要参数说明:

参数说明
-s签名服务器地址,统一使用 https://vsign.trustasia.com。
--cert_from证书来源,以管理员提供的配置为准
--cert_hash文件签名证书指纹
-u当前账户已安装的操作员证书指纹
--key_pin / -kPIN
-i输入文件路径
-o输出文件路径
--hash摘要算法,适用版本默认 sha256
--ts时间戳服务,适用版本默认 TrustAsia

6. 检查结果 ​

同时确认以下三项:

  1. 命令退出码为 0。
  2. 输出包含“签名成功”,且没有签名或时间戳失败提示。
  3. 本次输出目录中已生成非空的 signed.exe。

检查文件并记录 SHA256:

bash
test -s "$VSIGN_OUT_DIR/signed.exe" && ls -lh "$VSIGN_OUT_DIR/signed.exe"
sha256sum "$VSIGN_OUT_DIR/signed.exe"

SHA256 可用于核对复制或传输前后的文件是否一致。不同签名执行的时间戳等内容可能不同,因此新文件的 SHA256 不必与之前签名的文件相同。

部分参数错误仍可能返回退出码 0,不能仅凭退出码判断签名成功。 工具报告成功和文件哈希检查也不能替代独立验签。请继续在目标 Windows 环境检查签名者、时间戳和证书链。

在 Windows 上验证签名 ​

  1. 将本次生成的 signed.exe 复制到 Windows 电脑。
  2. 右键打开 属性 → 数字签名,核对签名者和时间戳。
  3. 选中签名并点击“详细信息”,确认签名有效,并核对签名证书是否为预期证书。

Windows 文件属性中的数字签名列表

已安装 Windows SDK SignTool 时,也可执行:

powershell
signtool verify /pa /all /v /tw "<待验证的已签名EXE文件的完整路径>"

/pa 使用默认 Authenticode 验证策略,/all 检查所有签名,/v 输出详细信息,/tw 在缺少时间戳时发出警告。检查通过后再分发最终文件;签名后修改程序内容,需要重新签名。

7. 单独添加时间戳(可选) ​

前述签名命令已通过 --ts TrustAsia 添加时间戳。需要为已有签名文件单独添加时间戳时,可执行下列命令;-i 应指向已签名文件:

bash
VSIGN_TIMESTAMP_OUTPUT='<添加时间戳后文件的输出路径>'
./ssigncode timestamp -i '<已签名EXE文件的完整路径>' -o "$VSIGN_TIMESTAMP_OUTPUT" --ts DigiCert
timestamp_rc=$?
printf '时间戳退出码:%s\n' "$timestamp_rc"

DigiCert 为原操作指南中记录通过验证的示例。输出文件请使用与输入不同的路径,确保父目录已存在且可写。成功时可看到“附加时间戳成功”。独立时间戳操作也应同时检查退出码、日志和新输出文件。

8. 常见报错与处理方法 ​

以下按报错关键字列出排查方向,完整提示可能随工具和系统版本不同。

提示或现象处理方法
Permission denied,工具无法执行执行 chmod u+x ./ssigncode 并检查父目录访问权限;仍失败时请管理员检查挂载点是否设置了 noexec。
cannot execute binary file: Exec format error使用 uname -m 查看主机架构,使用 file ./ssigncode 查看工具格式,获取与主机匹配的 Linux 工具。
GLIBC_x.xx not found当前系统缺少工具所需的 glibc 版本。使用 getconf GNU_LIBC_VERSION 查看环境,获取兼容工具或使用满足运行要求的主机。所需版本以工具交付说明为准。
error while loading shared libraries根据错误中的库名检查运行依赖,通过发行版软件包或工具交付包补齐匹配的库。
工具文件存在,但启动时报 No such file or directory除路径外,还需检查二进制指定的动态加载器是否存在,以及工具与系统是否兼容。
无法找到操作员证书确认当前账户已安装证书,重新查询实际 SHA1 指纹并核对 -u;不要填写安装 token 或签名证书 Hash
无该证书权限核对服务环境、证书来源及两个 Hash;请管理员确认操作员对目标签名证书的授权
授权已经过期,请联系证书所有者联系证书所有者核对平台授权有效期;授权过期与证书本身过期是不同问题
未获取到有效签名数据核对配置,并请管理员检查证书状态及授权;保留终端完整错误信息供技术支持排查
读取待签文件时报 no such file or directory用 ls -l "$VSIGN_INPUT" 核对输入路径、大小写和文件名;含空格的路径需使用引号。
lookup ... no such host 或时间戳域名无法解析检查报错域名、DNS 及网络配置,恢复解析后重新签名或添加时间戳。
connection refused、i/o timeout 或连接超时核对服务地址与端口,检查签名服务或时间戳服务是否可达,以及防火墙、代理配置。
x509: certificate signed by unknown authority检查系统 CA 信任库及企业代理证书配置,确认连接的是正确服务。
PIN 校验失败或密钥访问失败使用 云签详情 → 签名安全设置 中的当前 PIN,重新读取 VSIGN_PIN;安装 token 不能代替 PIN。
输出目录创建失败或输出文件不可写检查当前目录权限、磁盘空间及输出目录是否存在;确认本次 VSIGN_OUT_DIR 创建成功。
退出码为 0,但只显示帮助或没有输出文件参数可能未被正确解析。检查日志、必填参数及本次输出目录,不能将退出码单独作为成功依据。
只显示 Usage检查参数是否齐全及格式是否正确,使用 vsign --help 核对,不能视为签名成功
unknown command "verify"此版本无独立 verify 命令,请使用配套验签方案或联系技术支持

“无该证书权限”等提示不能单独证明签名证书已过期。怀疑有效期问题时,需分别检查操作员证书有效期、签名证书有效期和平台授权有效期。

操作结束后,可清理当前会话中的 PIN 变量:

bash
unset VSIGN_PIN

相关文档 ​