You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CPACK/NSIS打包时无法对卸载程序执行代码签名的问题求助

解决方案:通过CPack NSIS自定义钩子实现卸载程序签名

核心思路是利用CPack NSIS原生提供的脚本扩展能力,在卸载程序生成后、安装包打包完成前插入签名步骤,全程不修改CPack原有逻辑,所有CPack安装相关功能均可正常保留。

操作步骤

  1. 首先在CMakeLists.txt的CPack配置段中,添加自定义NSIS脚本的引入配置
# 引入自定义NSIS钩子脚本,路径替换为你实际存放脚本的位置
set(CPACK_NSIS_EXTRA_PRE_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/nsis_uninstall_sign_hook.nsi" CACHE INTERNAL "")

# 如果你需要从CMake传递签名工具路径和参数,可通过下面的配置注入到NSIS脚本
set(SIGNTOOL_PATH "C:/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64/signtool.exe" CACHE PATH "Path to signtool executable")
set(SIGNTOOL_ARGS "/f your_cert.pfx /p your_cert_password /t http://timestamp.digicert.com" CACHE STRING "Arguments for signtool")
set(CPACK_NSIS_DEFINES "${CPACK_NSIS_DEFINES} !define SIGNTOOL_PATH \"${SIGNTOOL_PATH}\" !define SIGNTOOL_ARGS \"${SIGNTOOL_ARGS}\"")
  1. 编写自定义NSIS钩子脚本nsis_uninstall_sign_hook.nsi
Function uninstGENERATE
    ; 等待卸载程序文件完全写入磁盘,避免签名时出现文件占用错误
    Sleep 1000
    ; 调用签名工具对生成的卸载程序进行签名
    ExecWait '"${SIGNTOOL_PATH}" sign ${SIGNTOOL_ARGS} "${UNINSTALL_OUT}"'
FunctionEnd
  1. 重新执行CPack生成安装包即可
    生成的安装包安装后,对应目录下的卸载程序会自带有效的数字签名,同时所有你之前配置的CPack安装功能完全不受影响。

注意事项

  • 如果签名工具路径包含空格,必须用双引号完整包裹路径,否则NSIS执行命令时会解析失败
  • 时间戳服务器可根据你的证书提供商进行替换,未添加时间戳的签名会在证书过期后失效
  • 如果使用其他签名工具(比如osslsigncode做跨平台签名),只需替换SIGNTOOL_PATH和SIGNTOOL_ARGS为对应工具的配置即可

内容的提问来源于stack exchange,提问作者hrn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:54:02