Appearance
在 Linux 上使用云签工具进行代码签名
适用于已开通 TrustAsia 云签服务,需要在 Linux 主机上使用 ssigncode 为 Windows EXE 文件签名的用户。整个流程为:准备工具和签名信息 → 安装操作员证书 → 查询操作员指纹 → 签名并添加时间戳 → 检查结果。
本文以 v4.6.16-2-g61ad30c 为例。原操作指南记录该版本在 Linux x86_64、glibc 2.34 环境通过了安装、签名和时间戳验证;这一记录不代表其他系统环境均已验证,也不代表必须使用完全相同的版本。请使用与主机架构及运行环境匹配的 Linux 工具。
1. 使用前准备
开始前,请确认云签订单中的代码签名证书已签发,并获取 Linux 版 ssigncode 工具。工具安装包和对应环境配置可向技术支持或平台管理员获取。
设置 PIN 并获取安装 token
- 进入目标订单的 云签详情 → 签名安全设置,设置签名 PIN;已设置过的使用当前 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 / -k | PIN |
-i | 输入文件路径 |
-o | 输出文件路径 |
--hash | 摘要算法,适用版本默认 sha256 |
--ts | 时间戳服务,适用版本默认 TrustAsia |
6. 检查结果
同时确认以下三项:
- 命令退出码为
0。 - 输出包含“签名成功”,且没有签名或时间戳失败提示。
- 本次输出目录中已生成非空的
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 上验证签名
- 将本次生成的
signed.exe复制到 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