使用PowerShell中SignTool签名MSI文件时触发certificateProfileName空值异常
问题场景
尝试使用以下PowerShell命令对MSI文件执行代码签名:
& "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe" sign /v /fd SHA256 /tr "http://tsa.msign.microsoft.com" /td SHA256 /dlib "C:\Users\DELL\AppData\Local\Microsoft\MicrosoftTrustedSigningClientTools\Azure.CodeSigning.Dlib.dll" /dmdf "D:\APPSign\metadata.json" "D:\Projects\App\APPWPF\Debug\APPWPF.msi"
执行后抛出以下错误:
Trusted Signing
Version: 1.0.68
"Metadata": { "Endpoint": "", // 此处已添加所选区域的URL "CodeSigningAccountName": "myapp",
"ExcludeCredentials": [] }提交摘要进行签名... 未处理托管异常
System.ArgumentNullException: 值不能为空。(参数 'certificateProfileName') at
Azure.CodeSigning.CertificateProfileClient.StartSignAsync(String
codeSigningAccountName, String certificateProfileName, SignRequest
body, String xCorrelationId, String clientVersion, CancellationToken
cancellationToken) at
Azure.CodeSigning.Dlib.Core.DigestSigner.SignAsync(UInt32 algorithm,
Byte[] digest, SafeFileHandle safeFileHandle, CancellationToken
cancellationToken) at
Azure.CodeSigning.Dlib.Core.DigestSigner.Sign(UInt32 algorithm, Byte[]
digest, SafeFileHandle safeFileHandle) at
AuthenticodeDigestSignExWithFileHandleManaged(_CRYPTOAPI_BLOB*
pMetadataBlob, UInt32 digestAlgId, Byte* pbToBeSignedDigest, UInt32
cbToBeSignedDigest, Void* hFile, _CRYPTOAPI_BLOB* pSignedDigest,
_CERT_CONTEXT** ppSignerCert, Void* hCertChainStore)SignTool错误:发生意外的内部错误。错误信息: "Error: SignerSign() failed." (-2147467259/0x80004005)
当前使用的metadata.json内容如下:
{ "Endpoint": "", // 此处已添加所选区域的URL "CodeSigningAccountName": "myapp", "SigningProfileName": "myapp", // 账户与证书名称一致 }
问题原因与解决方案
核心原因
你在metadata.json中使用了错误的字段名:配置的是SigningProfileName,但Azure信任签名的DLL要求的必填字段是CertificateProfileName(拼写和大小写必须完全匹配),导致程序无法找到该参数值,触发空引用异常。
修正后的metadata.json
{ "Endpoint": "你的区域Endpoint URL", // 替换为实际的信任签名区域URL "CodeSigningAccountName": "myapp", "CertificateProfileName": "myapp" }
额外注意事项
- 确保
Endpoint填写正确的区域URL(例如https://wus.codesigning.azure.net,需与你的信任签名账户所在区域对应) CertificateProfileName必须与Azure信任签名中创建的证书配置文件名称完全一致- 移除JSON中的注释(部分JSON解析器不支持注释,可能引发解析异常)
修正后重新执行签名命令,即可解决该空引用异常。
内容的提问来源于stack exchange,提问作者MANSI

