2023 年 6 月后如何使用 Azure KeyVault 存储的证书签署 xlsm 文件?

问题描述 投票:0回答:1

其他类似的帖子建议使用 AzureSignTool,但是,AzureSignTool 不接受 xlsm 作为有效文件类型。

之前我们使用Windows签名工具,但是新证书无法导出,因此我们不能再使用此方法。

我们的签名是作为 DevOps 中 CI/CD 管道的一部分完成的,因此我们希望避免使用 fips 设备或 yubikey 手动签署 VBA(如果可能)。

尝试使用 AzureSignTool,但它说 xlsm 是不受支持的文件类型。

仅对摘要文件进行签名是不够的,因为 Excel 安全设置将拒绝任何未签名的宏。

无法将导出的证书与signtool一起使用,因为它不包含私钥。

excel digital-signature azure-keyvault
1个回答
0
投票

虽然最好将私钥保留在 Key Vault 中 - 并且根据设计,您根本无法从托管 HSM 导出私钥 - 如果您也拥有

secret/get
权限,则可以下载证书密钥对.

我在 Azure SDK 的 CertificateClient 中添加了

DownloadCertificate
方法,或者,如果您无法使用旧版本,可以查看之前的示例代码:https://learn.microsoft.com/samples/azure/azure -sdk-for-net/获取证书私钥/

或者,您是否尝试过 Azure Pipelines 的 Azure 代码签名任务 或 GitHub Actions 的

如果不支持

.xlsm,则托管代理可能没有安装必要的 Authenticode 提供程序。 SignTool 和 AzureSignTool 都依赖于 Authenticode API,而后者又依赖于提供程序。许多都内置于 Windows 中,但 Office 可能并非如此。您可以针对代理提供商提交错误,例如针对托管代理的 Microsoft 或 GitHub。

Office 也可能不安装 SIP。使用下面的示例程序并检查我现有的 .xlsx 文件,我得到 -2146762749 或

TRUST_E_SUBJECT_FORM_UNKNOWN

 意味着 SIP 未知。

#pragma comment(lib, "crypt32.lib") #define UNICODE #include <stdio.h> #include <windows.h> #include <mssip.h> int wmain(int argc, wchar_t* argv[]) { if (argc < 2) { fprintf(stderr, "sipchk.exe <filename>\n"); return 1; } GUID pgSubject = {}; if (!CryptSIPRetrieveSubjectGuid(argv[1], nullptr, &pgSubject)) { auto err = GetLastError(); fwprintf(stderr, L"failed to check %ls: %d\n", argv[1], err); return err; } SIP_DISPATCH_INFO sip = { sizeof(SIP_DISPATCH_INFO) }; if (!CryptSIPLoad(&pgSubject, 0, &sip)) { auto err = GetLastError(); fwprintf(stderr, L"failed to load SIP for %ls: %d\n", argv[1], err); return err; } HMODULE hMod = 0; if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCWSTR)sip.pfGet, &hMod)) { auto err = GetLastError(); fwprintf(stderr, L"failed to get SIP module for %ls: %d\n", argv[1], err); return err; } wchar_t wzPath[MAX_PATH]; if (!GetModuleFileName(hMod, wzPath, MAX_PATH)) { auto err = GetLastError(); fwprintf(stderr, L"failed to get SIP module filename for %ls: %d\n", argv[1], err); return err; } wprintf(L"%ls would be processed by SIP %ls\n", argv[1], wzPath); return 0; }
    
© www.soinside.com 2019 - 2024. All rights reserved.