从代码签名的技术与合规角度,“未知开发者 / 未知发布者” 的核心原因是:你的软件没有被系统信任的数字证书签名,导致操作系统(Windows SmartScreen /macOS Gatekeeper)无法验证发布者身份与代码完整性。
下面从原理 → 证书选型 → Windows 签名 → macOS 签名 → 长期信任完整说明。
一、为什么未签名会报 “未知开发者”?
系统安全机制的核心判断:
- 身份不可信:没有权威 CA(证书颁发机构)签发的代码签名证书,系统无法确认 “软件是谁做的”
- 完整性风险:未签名文件可能被篡改、植入病毒,签名一旦被修改就会失效
- 信誉机制:Windows SmartScreen 会对新证书 / 未签名软件强制警告,EV 证书可直接绕过
只有正规代码签名才能彻底消除警告,用户端看到 “发布者:XX 公司”。
二、代码签名证书类型与选型(Windows)
1. OV 代码签名(组织验证,主流)
- 效果:显示公司名,新证书前 2–8 周仍有警告,积累信誉后自动消失
- 适用:常规软件、工具、安装包(.exe/.msi/.dll)
- 审核:1–3 天,需营业执照、法人信息
2. EV 代码签名(扩展验证,最高信任)
- 效果:立即消除 SmartScreen 警告,无过渡期
- 价格:¥4,000–8,000 / 年
- 强制场景:内核驱动、Windows 10/11 驱动签名、WHQL 认证
- 安全:私钥存USB Token 硬件(不可导出)
- 审核:5–7 天,更严格的企业核验
3. 自签名(仅内部测试)
- 免费,但公开发布完全无效
- 用户会报 “不受信任的发布者”,需手动导入根证书(不可行)
4. 免费方案(开源 / 测试)
- Sigstore:GitHub 账号 OIDC 签名,证明未篡改,但 Windows 仍可能提示
选型建议
- 普通软件:OV 证书(性价比)
- 驱动 / 高信任需求:EV 证书
- 个人 / 小微:注册个体户 → 申请 OV
三、Windows 完整代码签名流程(彻底解决 “未知发布者”)
1. 申请证书(CA 机构)
主流 CA:DigiCert、Sectigo、GlobalSign、JoySSL(国内)
-
准备材料:
- 企业:营业执照、法人身份证、对公账户验证
- 个人:个体户执照 + 身份证
-
生成 CSR(证书签名请求)
powershell
# PowerShell生成 New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=你的公司名" -KeyUsage DigitalSignature -
提交 CA 审核 → 获取 .pfx 证书(OV)或 USB Token(EV)
2. 用 SignTool 签名(Windows SDK)
(1)安装 SignTool
- 安装 Windows SDK 或 Visual Studio(含签名工具)
(2)签名命令(必加时间戳!)
cmd
signtool sign /f 证书.pfx /p 证书密码 /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 你的软件.exe
/f:证书文件/p:证书密码/fd SHA256:签名算法(必须 SHA256,旧 SHA1 无效)/tr:时间戳服务器(关键!避免证书过期后签名失效)
(3)验证签名
cmd
signtool verify /pa /v 你的软件.exe
- 成功:显示 “数字签名详细信息”→ 发布者为你的公司名
3. 提升 SmartScreen 信誉(OV 证书必做)
- 保持同一证书长期签名、持续分发
- 提交微软 SmartScreen 信誉申请
- 避免报毒:签名后用杀毒软件扫描、不捆绑恶意程序
四、macOS 代码签名(解决 “无法打开,因为来自未知开发者”)
1. 前提:苹果开发者账号
- 年费:¥688 / 年(个人 / 公司)
- 申请:Apple Developer → 实名认证
2. 证书类型
- Developer ID Application:用于非 App Store 分发(直接官网下载)Apple Developer
3. 签名 + 公证(macOS 10.15+ 必须)
(1)用 codesign 签名
bash
运行
# 签名(--deep递归签内嵌组件)
codesign --force --deep --sign "Developer ID Application: 你的公司名 (TeamID)" --timestamp 你的App.app
--timestamp:添加时间戳(必加)- 查看证书:
security find-identity -v -p codesigning
(2)苹果公证(Notarize)—— 强制!
bash
运行
# 上传公证
xcrun notarytool submit 你的App.zip --apple-id 你的邮箱 --password 专用密码 --team-id 你的TeamID
# 查看日志
xcrun notarytool log 提交ID --apple-id 你的邮箱 --password 专用密码 --team-id 你的TeamID
# stapler 绑定公证结果(离线也可验证)
xcrun stapler staple 你的App.app
- 公证通过后:彻底消除 Gatekeeper 警告
(3)验证
bash
运行
codesign -vvv 你的App.app
spctl -a -vvv 你的App.app
- 成功:
accepted、source=Developer ID
五、关键最佳实践(必看)
-
必须加时间戳
- 无时间戳:证书过期 → 签名失效 → 重新报未知发布者
-
SHA256 算法
- SHA1 已被系统弃用,必须用 SHA256
-
证书安全
- EV 私钥存硬件 Token,不导出、不泄露
- OV 证书(.pfx)加密保存,权限最小化
-
驱动程序特殊要求
- Windows 10/11:必须 EV 签名 + WHQL 认证
- 未签名驱动:无法安装(拦截率≈100%)
-
避免无效方案
- 自签名、免费 SSL 证书(Let’s Encrypt)不能用于代码签名
六、效果对比(签名 vs 未签名)
表格
| 状态 | 用户看到 | 系统警告 | 转化率 |
|---|---|---|---|
| 未签名 | 未知发布者 | 红色强拦截 | 低(流失 70%+) |
| OV 签名(新) | 公司名 | 轻度警告 | 中 |
| OV(信誉满) | 公司名 | 无警告 | 高 |
| EV 签名 | 公司名 | 立即无警告 | 最高 |
| macOS 签名 + 公证 | 可信开发者 | 无警告 | 高 |
七、总结(最简路径)
-
Windows
- 常规软件:买 OV 代码签名证书 → SignTool SHA256 + 时间戳 → 积累信誉
- 驱动:EV 证书 + WHQL
-
macOS
- 苹果开发者账号 → Developer ID 签名 + 公证
一句话:正规代码签名是唯一彻底解决 “未知开发者” 的方法,临时绕过只是权宜之计。