我们遇到了类似的问题 - 我们有一个 .NET 4.0 应用程序,旨在在具有 .NET 4.0 或更高版本的机器上工作。由于我们的代码签名证书过期,我们购买了一个新的,并且由于 Sha1 将被弃用,我们收到了一个 Sha256 证书。我应该说我们的构建机器安装了 .NET 4.5,所以框架程序集都在该机器上更新。
我们注意到,一旦我们迁移到新证书,以下错误开始仅出现在 .NET 4.0 机器上:
* Activation of http://localhost/publish/Test.application resulted in exception. Following failure messages were detected:
+ Exception reading manifest from http://localhost/publish/Test.application: the manifest may not be valid or the file could not be opened.
+ Manifest XML signature is not valid.
+ SignatureDescription could not be created for the signature algorithm supplied.
经过一番研究,fe 发现了这个线程和其他一些线程,建议升级到 .NET 4.5,但这对我们来说不是有效的解决方案——我们不想强迫我们的客户更新 .NET 框架(约 20% 仍在使用.NET 4.0)。以下是我们提出的解决方案:
- 在仅安装了 .NET 4.0 的机器上签署清单
- 使用以下 PowerShell 脚本而不是使用 mage.exe 进行签名:
函数签名文件($filePath,$timeStampUri,$certThumbprint)
{
#Add-Type System.Security
$x509Store = New-Object -TypeName ([System.Security.Cryptography.X509Certificates.X509Store]) -ArgumentList ([System.Security.Cryptography.X509Certificates.StoreName]::My),([System.Security.Cryptography.X509Certificates. StoreLocation]::CurrentUser)
尝试
{
$x509Store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadOnly)
$x509Certificate2Collection = $x509Store.Certificates.Find([System.Security.Cryptography.X509Certificates.X509FindType]::FindByThumbprint, $certThumbprint, $false);
if ($x509Certificate2Collection.Count -eq 1)
{
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]@($x509Certificate2Collection)[0]
# 这将强制使用 SHA1 而不是 SHA256
$cert.SignatureAlgorithm.FriendlyName = ""
添加类型-AssemblyName“Microsoft.Build.Tasks.v4.0”
[Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities]::SignFile($cert, $timeStampUri, $filePath)
}
}
最后
{
$x509Store.Close();
}
}
编辑:我实际上使用这个命令来签署清单文件:
https ://gist.github.com/nedyalkov/a563dd4fb04d21cb91dc
希望这些信息能为某人节省时间和精力!