我正在尝试对打包为VSIX文件的Visual Studio 2012 extension进行签名。
我遵循了http://www.jeff.wilcox.name/2010/03/vsixcodesigning/上的说明;但是,我对在不指定pfx文件和密码的情况下执行签名很感兴趣。
例如,如果我调用'signtool.exe',我的命令行将是:
"signtool.exe" sign /n MySubjectName /t 'http://timestamp.verisign.com/scripts/timstamp.dll' /d "MyDescription" MyPackage.vsix我知道这个命令不适用于VSIX文件,但它适用于MSI归档。
有了这个命令,我就不需要在调用signtool时指定密码或pfx文件。使用指定的主题MySubjectName选择最佳安装的证书。
遵循Jeff's Blog上的代码,签名步骤需要定义pfx文件名和密码,以创建签名中使用的X509Certificate2:
private static void SignAllParts(Package package, string pfx, string password, string timestamp){
var signatureManager = new PackageDigitalSignatureManager(package);
signatureManager.CertificateOption = CertificateEmbeddingOption.InSignaturePart;
/*...*/
signatureManager.Sign(toSign, new System.Security.Cryptography.X509Certificates.X509Certificate2(pfx, password));
}有没有涉及PackageDigitalSignatureManager的API可以让我找到一个基于MySubjectName的X509Certificate,这样我就可以在上面签名了?
发布于 2015-03-16 17:25:46
我已经通过迭代在当前用户的存储中找到的证书解决了这个问题。我按颁发者名称过滤,只获取有效证书,然后循环匹配的证书,并返回第一个也与主题名称匹配的证书:
public static X509Certificate2 Find(string issuer, string subject)
{
var certStore = new X509Store (StoreName.My, StoreLocation.CurrentUser);
certStore.Open (OpenFlags.ReadOnly);
var certCollection = certStore.Certificates.Find (X509FindType.FindByIssuerName, issuer, true);
foreach (var cert in certCollection)
{
if (cert.FriendlyName == subject)
{
return cert;
}
}
return null;
}https://stackoverflow.com/questions/13370533
复制相似问题