编辑

编辑

我最近安装了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命令确实是创建自签名证书的一种方法,但这是另一个主题。(存储库中有示例。)

相关内容