Set-Authenticode 似乎错误地签署了指定的程序集
Set-Authenticode appears to incorrectly sign the specified assembly
我在使用 Set-Authenticode
powershell 函数作为 Azure DevOps 管道的一部分来签署 .NET Standard 2.0 程序集时遇到问题。我已经编写了一些 powershell 来遍历目录中的程序集并将签名应用于文件夹中的每个 DLL:
$project = "${{ parameters.projects }}"; # todo: what about multi-line values here
$folderPath = [System.IO.Directory]::GetParent($project)
$files = Get-ChildItem -Path $folderPath -Filter "*.dll" -Recurse
$securePassword = ConvertTo-SecureString $(CertificatePassword) -AsPlainText -Force
$certificate = Get-PfxCertificate -FilePath $(CodeSignCertificate.secureFilePath) -NoPromptForPassword -Password $securePassword
foreach($file in $files) {
Write-Host "Setting Authenticode Signature for $file"
$result = Set-AuthenticodeSignature -FilePath $file -Certificate $certificate -Force -HashAlgorithm SHA256 -IncludeChain All -TimestampServer "http://tsa.starfieldtech.com"
if ($result.Status.ToString().Contains("Error")) { Write-Error $result.StatusMessage }
else {
Write-Host $result.Status.ToString()
Write-Host $result.StatusMessage.ToString()
}
}
该过程似乎成功完成,每个签名的 DLL 输出以下消息,根据我脚本中的三个 Write-Host
行:
Setting Authenticode Signature for D:\a\s\...\SomeAssembly.dll
Valid
Signature verified.
现在,在使用 Nuget Package Explorer 检查构建结束时生成的 DLL 时,问题变得很明显。我看到以下错误:"The file is signed, however the signed hash does not match the computed hash"。在此屏幕截图中可以看到这一点(将鼠标悬停在红色错误图标上时,错误显示为工具提示)。
我也试过:
运行 这在本地使用自签名证书,似乎工作正常。
运行 在较旧的构建代理上构建 - 在这种情况下,签名过程在构建期间失败并出现错误 "Get-PfxCertificate : The specified network password is not correct".
使用 signtool.exe。这会产生相同的错误。
我现在肯定 运行 没主意了。我可能缺少什么?
其实我已经自己想出来了。
我的代码签名管道步骤之后是强命名步骤。强命名步骤正在更改程序集的散列,因此它不再匹配签名中指定的散列。
解决方案是将强命名步骤移到代码签名步骤之前。现在我可以成功地对程序集进行强命名,对其进行签名,然后在打包之后,我可以对 nuget 包进行签名并且所有签名在输出中都是有效的。
我在使用 Set-Authenticode
powershell 函数作为 Azure DevOps 管道的一部分来签署 .NET Standard 2.0 程序集时遇到问题。我已经编写了一些 powershell 来遍历目录中的程序集并将签名应用于文件夹中的每个 DLL:
$project = "${{ parameters.projects }}"; # todo: what about multi-line values here
$folderPath = [System.IO.Directory]::GetParent($project)
$files = Get-ChildItem -Path $folderPath -Filter "*.dll" -Recurse
$securePassword = ConvertTo-SecureString $(CertificatePassword) -AsPlainText -Force
$certificate = Get-PfxCertificate -FilePath $(CodeSignCertificate.secureFilePath) -NoPromptForPassword -Password $securePassword
foreach($file in $files) {
Write-Host "Setting Authenticode Signature for $file"
$result = Set-AuthenticodeSignature -FilePath $file -Certificate $certificate -Force -HashAlgorithm SHA256 -IncludeChain All -TimestampServer "http://tsa.starfieldtech.com"
if ($result.Status.ToString().Contains("Error")) { Write-Error $result.StatusMessage }
else {
Write-Host $result.Status.ToString()
Write-Host $result.StatusMessage.ToString()
}
}
该过程似乎成功完成,每个签名的 DLL 输出以下消息,根据我脚本中的三个 Write-Host
行:
Setting Authenticode Signature for D:\a\s\...\SomeAssembly.dll
Valid
Signature verified.
现在,在使用 Nuget Package Explorer 检查构建结束时生成的 DLL 时,问题变得很明显。我看到以下错误:"The file is signed, however the signed hash does not match the computed hash"。在此屏幕截图中可以看到这一点(将鼠标悬停在红色错误图标上时,错误显示为工具提示)。
我也试过:
运行 这在本地使用自签名证书,似乎工作正常。
运行 在较旧的构建代理上构建 - 在这种情况下,签名过程在构建期间失败并出现错误 "Get-PfxCertificate : The specified network password is not correct".
使用 signtool.exe。这会产生相同的错误。
我现在肯定 运行 没主意了。我可能缺少什么?
其实我已经自己想出来了。
我的代码签名管道步骤之后是强命名步骤。强命名步骤正在更改程序集的散列,因此它不再匹配签名中指定的散列。
解决方案是将强命名步骤移到代码签名步骤之前。现在我可以成功地对程序集进行强命名,对其进行签名,然后在打包之后,我可以对 nuget 包进行签名并且所有签名在输出中都是有效的。