我最近安装了context
在一台我无法控制安全策略的笔记本电脑上。笔记本电脑安装了 Symantec Endpoint Protection,当我尝试context
从命令行运行可执行文件时,Symantec Endpoint Protection 打开了此窗口:
事实证明,我只需允许文件和可执行文件按预期工作即可。我想签名此程序,以便 Symantec 不会将其视为安全风险。我安装了 Windows 软件开发工具包并signtool
尝试了以下命令:
signtool sign /fd C:\context\tex\texmf-win64\bin\context.exe
不幸的是,我收到一个错误:
SignTool 错误:指定的算法无法使用或者无效。
我怎样才能签署文件而不signtool
抛出这样的错误?我看过一些关于的内容certreq
,但我不确定这是否是可行的方法……
编辑
根据@user1686的回答,以及提供的例子我在 powershell 中执行以下操作:
> $certificate = New-SelfSignedCertificate -CertStoreLocation cert:\currentuser\my `
>> -Subject "CN=Test Code Signing" `
>> -KeyAlgorithm RSA `
>> -KeyLength 2048 `
>> -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" `
>> -KeyExportPolicy Exportable `
>> -KeyUsage DigitalSignature `
>> -Type CodeSigningCert
> signtool sign /fd $certificate.getcerthashstring() $(where.exe context)
SignTool Error: The specified algorithm cannot be used or is invalid.
正如您所看到的,我仍然收到相同的错误,但看起来New-SelfSignedCertificate
已成功生成一个我可以使用的带有哈希字符串的数字证书......
答案1
Symantec Endpoint Protection 不会接受您在本地生成的任何数字签名。
该签名必须是赛门铁克认可的签名,即从赛门铁克知名且信任的卖家处购买的代码签名。
避免出现该消息的一种方法是联系您公司的 Symantec Endpoint Protection 管理员并要求将context
可执行文件列入白名单。
答案2
虽然 signtool 的帮助文本中没有显示,但该/fd
选项实际上采用了哈希算法名称,例如/fd SHA256
。就您而言,“C:\…\context.exe”确实不是有效的算法名称。
您可能还需要一些其他选项:
/a
让 signtool 自动选择代码签名证书。(这里假设你有安装在 certmgr.msc 中的代码签名证书 - 如果没有,则您无法签名。)/tr http://timestamp.digicert.com /td SHA256
附加时间戳即使您的代码签名证书过期,签名仍然有效。/v
让 signtool 更清楚地说明它的功能。
如果您没有代码签名证书,有三种方法可以获取:
全球有效:从证书颁发机构购买(查看销售 TLS/HTTPS 证书的常见地点)。在这种情况下,您不需要更昂贵的“EV 代码签名”变体,只需要常规(但仍然昂贵)的非 EV 变体。
在整个组织范围内有效:如果笔记本电脑已加入公司的 Active Directory(而非 Azure AD)域,并且公司有可用的 AD 证书服务,请尝试通过以下方式从那里申请一个
certmgr.msc
→ 个人 → 所有任务 → 申请新证书从那里申请一个。您的管理员可能需要批准。(如果列表中没有显示模板,则表示此选项不可用。)仅在计算机上有效:创建自签名证书并将其安装在计算机的“受信任的发布者”部分(不是受信任的根!)。该
certreq
命令确实是创建自签名证书的一种方法,但这是另一个主题。(这存储库中有示例。)