对Visual Studio 2012 VSIX扩展进行数字签名

我正在尝试签署一个打包为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博客上的代码,签名步骤要求定义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可能让我找到基于MySubjectNameX509Certificate ,以便我可以签名?

我通过迭代当前用户商店中的证书来解决这个问题。 我按发行者名称过滤并只获取有效证书,然后我循环匹配的证书并返回第一个与主题名称匹配的证书:

 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; }