【问题标题】:Digitally sign a Visual Studio 2012 VSIX extension对 Visual Studio 2012 VSIX 扩展进行数字签名
【发布时间】:2012-11-13 23:15:05
【问题描述】:

我正在尝试签署一个打包为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 可以让我找到基于 MySubjectNameX509Certificate 以便我可以签署反对?

【问题讨论】:

  • 这可能包含我正在寻找的答案:msdn.microsoft.com/en-us/library/…
  • 没有这样的API,可以通过主题名称获取证书。不过可以看一下X509Certificate2类的Import方法。

标签: c# visual-studio-2010 visual-studio-2012 digital-signature vsix


【解决方案1】:

我通过遍历当前用户存储中的证书解决了这个问题。我按颁发者名称过滤并只获取有效证书,然后循环匹配的证书并返回第一个也匹配主题名称的证书:

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

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2013-01-29
    • 1970-01-01
    相关资源
    最近更新 更多