其他类似的帖子建议使用 AzureSignTool,但是,AzureSignTool 不接受 xlsm 作为有效文件类型。
之前我们使用Windows签名工具,但是新证书无法导出,因此我们不能再使用此方法。
我们的签名是作为 DevOps 中 CI/CD 管道的一部分完成的,因此我们希望避免使用 fips 设备或 yubikey 手动签署 VBA(如果可能)。
尝试使用 AzureSignTool,但它说 xlsm 是不受支持的文件类型。
仅对摘要文件进行签名是不够的,因为 Excel 安全设置将拒绝任何未签名的宏。
无法将导出的证书与signtool一起使用,因为它不包含私钥。
虽然最好将私钥保留在 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;
}