CPACK/NSIS打包时无法对卸载程序执行代码签名的问题求助
解决方案:通过CPack NSIS自定义钩子实现卸载程序签名
核心思路是利用CPack NSIS原生提供的脚本扩展能力,在卸载程序生成后、安装包打包完成前插入签名步骤,全程不修改CPack原有逻辑,所有CPack安装相关功能均可正常保留。
操作步骤
- 首先在
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}\"")
- 编写自定义NSIS钩子脚本
nsis_uninstall_sign_hook.nsi
Function uninstGENERATE ; 等待卸载程序文件完全写入磁盘,避免签名时出现文件占用错误 Sleep 1000 ; 调用签名工具对生成的卸载程序进行签名 ExecWait '"${SIGNTOOL_PATH}" sign ${SIGNTOOL_ARGS} "${UNINSTALL_OUT}"' FunctionEnd
- 重新执行CPack生成安装包即可
生成的安装包安装后,对应目录下的卸载程序会自带有效的数字签名,同时所有你之前配置的CPack安装功能完全不受影响。
注意事项
- 如果签名工具路径包含空格,必须用双引号完整包裹路径,否则NSIS执行命令时会解析失败
- 时间戳服务器可根据你的证书提供商进行替换,未添加时间戳的签名会在证书过期后失效
- 如果使用其他签名工具(比如osslsigncode做跨平台签名),只需替换
SIGNTOOL_PATH和SIGNTOOL_ARGS为对应工具的配置即可
内容的提问来源于stack exchange,提问作者hrn
相关产品推荐
相关产品推荐

