0

0

C# 代码签名方法 C#如何为程序集和安装包签名

畫卷琴夢

畫卷琴夢

发布时间:2026-03-01 09:55:03

|

389人浏览过

|

来源于php中文网

原创

signtool.exe 为 .net 程序集签名需使用有效可导出私钥的代码签名证书,添加 authenticode 签名节而不修改 il;签名后须验证有效性并确保时间戳、证书链及依赖项均合规。

c# 代码签名方法 c#如何为程序集和安装包签名

如何用 signtool.exe 为 .exe/.dll 签名

签名程序集本身不改变 IL,而是向 PE 文件添加 Authenticode 签名节。.NET 程序集(.exe/.dll)必须是已编译的托管二进制(非源码),且不能是仅含 PDB 的文件。

  • 确保已安装 Windows SDK 或 Visual Studio(含 signtool.exe,通常位于 "C:\Program Files (x86)\Windows Kits\10\bin\<version>\x64\signtool.exe"</version>
  • 使用有效代码签名证书(.pfx 文件),私钥需可导出且未被标记为“不可导出”
  • 签名命令示例:
    signtool sign /f "mycert.pfx" /p "password" /t "http://timestamp.digicert.com" MyApp.exe
  • 若提示 SignTool Error: No certificates were found that met all the given criteria.,检查证书是否导入到当前用户或本地计算机的 Personal 存储,并确认其增强型密钥用法(EKU)包含 Code Signing
  • /tr 和 /td 参数用于 SHA-2 时间戳(推荐),避免旧版 /t 在 2025 年后失效

为什么给 .NET 程序集签名后仍被杀毒软件拦截

Authenticode 签名不等于“免检”,尤其对新证书、低信誉发布者或无时间戳的签名,Windows SmartScreen 和部分 AV 仍会警告。

如此AI员工
如此AI员工

国内首个全链路营销获客AI Agent

下载
  • 签名只是证明“此文件来自某实体”,不提供安全担保;首次分发时仍需积累信誉(如通过 Microsoft SmartScreen Reputation Service)
  • 若程序集依赖未签名的 native DLL(如 C++ 运行时或驱动),整个信任链断裂,系统可能忽略 .NET 部分签名
  • 调试版程序集(含 DebuggableAttribute 或 PDB 路径残留)易被误判为开发中软件,建议发布前用 ilasm + ildasm 清除调试元数据,或用 dotnet publish -c Release --self-contained true 构建干净输出
  • 签名后务必用 signtool verify /pa MyApp.exe 验证签名有效性,再用 certutil -verifystore my 检查证书链完整性

为 MSI 安装包签名的特殊注意事项

MSI 是数据库文件,不是 PE 格式,不能直接用 signtool sign —— 必须用 signtool sign /fd SHA256 /a 并指定 /d(描述)和 /du(URL),否则 Windows Installer 可能拒绝执行。

  • MSI 签名必须使用 /a(自动选择证书)或显式指定 /f,且证书必须支持 Code Signing EKU 和 Document Signing(某些 CA 要求两者兼备)
  • 签名前确保 MSI 已关闭所有打开句柄(例如未在 Orca 中打开、未被 msiexec 占用),否则报错 SignTool Error: The specified file could not be opened
  • 若用 WiX Toolset 构建 MSI,可在 WixProj 中配置 <signoutput>true</signoutput>,并设置 <signertoolpath></signertoolpath> 指向 signtool.exe,但需注意:WiX v3 默认调用旧版 signtool,v4+ 推荐手动 post-build 签名更可控
  • 签名后用 msiexec /a package.msi /qn 测试静默安装是否仍触发 UAC 提示;若提示“无法验证发布者”,说明签名未被系统信任或时间戳服务不可达

PowerShell 脚本或 ClickOnce 应用怎么签

PowerShell 脚本(.ps1)和 ClickOnce 发布物(.application + .manifest)签名机制完全不同,不能混用 PE 签名流程。

  • .ps1 文件必须用 Set-AuthenticodeSignature cmdlet,且证书需导入到 CurrentUser\Trusted PublishersLocalMachine\Trusted Publishers 才能绕过 ExecutionPolicy 限制
  • ClickOnce 应用需先用 mage.exe -sign 签署部署清单(.application)和应用程序清单(.manifest),且两个文件必须用同一证书;mage.exe 路径通常在 "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\mage.exe"
  • 若 ClickOnce 安装后提示“部署清单签名无效”,常见原因是:部署清单时间戳与应用程序清单不一致、证书私钥权限不足(运行 mage -cc 清缓存后再重签)、或 IIS 未正确设置 .manifest MIME 类型(应为 application/x-ms-manifest
  • PowerShell 签名后仍被阻止?检查 Get-ExecutionPolicy -Scope CurrentUser 是否为 RemoteSigned 或更低;仅 AllSigned 会强制校验本地脚本签名
实际操作中最容易卡在证书存储位置和时间戳服务兼容性上,尤其是企业环境常禁用外部 HTTP 时间戳,得提前配好内部 TSA 或改用 /tr https://rfc3161timestamp.globalsign.com/advanced 这类 HTTPS 地址。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

411

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

357

2023.10.25

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

411

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

357

2023.10.25

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1335

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1156

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

825

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

460

2023.08.02

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

6

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.4万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 19.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号