我的公司最近对代码签名证书的过期感到惊讶,不得不忙着寻找替代证书,却发现代码签名的格局从去年开始已经转变为基于 USB 密钥的系统,其中不需要证书一般情况下可以直接访问更长的时间。在研究替代方案时,我们选择了新的 Azure 可信签名服务,该服务提供一种“签名即服务”体验,并且我们能够临时调整我们的构建流程,以便在 Windows 环境中充分使用它。我们现在希望将其正确合并到我们的现代 CI/CD 管道中,但几年前我们已转向 Linux 构建时和运行时,并且似乎没有明显的方法从 Linux 运行时调用 Azure 可信签名.
主要支持的方式(根据此处的文档https://learn.microsoft.com/en-us/azure/trusted-signing/how-to-signing-integrations)似乎是使用特殊版本的signtool.exe 似乎旁加载了一个单独的 MS 库,该库向 Azure 中的签名资源发出 Web 请求。这是我之前所做的工作,它似乎是隐藏在列出的所有替代方案(github/Azure Devops action、powershell、sdk)之下的内容,但所有这些似乎都是全新的,没有文档/说明,也没有人还询问过它们,没有一个在 Windows 环境之外工作。
我尝试使用 Wine 9 通过全新安装从 Ubuntu 20.04 上下文调用我的工作signtool.exe 设置,但我收到一个错误,我不知道如何解决:
wine "./Microsoft.Windows.SDK.BuildTools_10.0.22621.0/signtool.exe" sign /debug /v /fd SHA256 /tr "http://timestamp.acs.microsoft.com" /td SHA256 /dlib "./Microsoft.Trusted.Signing.Client_1.0.53/Azure.CodeSigning.Dlib.dll" /dmdf "./signinfo.json" "/home/asdf.exe"
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
00f8:err:module:import_dll Library MFC42.dll (which is needed by L"Z:\\home\\Microsoft.Windows.SDK.BuildTools_10.0.22621.0\\signtool.exe") not found
00f8:err:module:loader_init Importing dlls for L"Z:\\home\\Microsoft.Windows.SDK.BuildTools_10.0.22621.0\\signtool.exe" failed, status c0000135
我已成功运行 winetricks mfc42 并验证了 .dll 位于 syswow64 虚拟文件夹中,并且我尝试将包含 Signtool 资源的文件夹移动到虚拟程序文件目录中,但均无效。我调用的signtool.exe版本是64位,我通过运行wine notepad.exe来验证我的wine安装是否正常工作。
作为一种解决方法,我目前正在开发一个 Azure 函数,我的构建可以在签署 .exe 时调用该函数(所有这些都是为了我可以处于 Windows 上下文中),但这代表着巨大的安全风险,因为我'我本质上只是创建一个 URL,防火墙后面的任何人都可以点击该 URL 来签署他们想要的任何内容。
为什么使用wine运行signtool.exe不起作用?假设我不想切换到另一个代码签名提供商并希望继续使用 Azure 可信签名,是否有更好的方法来完成我想要做的事情?
Azure 可信签名由 Jsign 支持,这是signtool.exe 的跨平台开源替代品。不需要酒。语法如下:
jsign --storetype TRUSTEDSIGNING \
--keystore weu.codesigning.azure.net \
--storepass <api-access-token> \
--alias <account>/<profile> application.exe
Azure 可信签名支持将成为即将发布的 7.0 版本的一部分。与此同时,您必须自己构建项目(使用
mvn package -DskipTests
)或从 GitHub Actions 下载最新的 CI 工件。
(免责声明:我是这个项目的作者)