3

Visual Studio 2012 extensionファイルとしてパッケージ化されたに署名しようとしていVSIXます。

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 ファイルを指定する必要がありません。指定された subject を使用して、最適にインストールされた証明書が選択されます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 はありますか?X509CertificateMySubjectName

4

1 に答える 1

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;
}
于 2015-03-16T09:25:45.667 に答える