【问题标题】:SignerSign error - No provider was specified for the store or objectSignerSign 错误 - 没有为商店或对象指定提供者
【发布时间】:2013-01-09 14:19:46
【问题描述】:

我正在开发一个 c# .net 3.5 应用程序(编译到 anycpu)

我需要签署一个可执行文件。我尝试使用here 中的代码并进行一些修改。 我没有在商店中搜索证书,而是从 pfx 文件中加载了它:

  var cert = new X509Certificate2("myCert.pfx", "pass");

并像这样更改方法符号:

  public static void Sign(string appPath, X509Certificate2 cert)
    {
        var pSignerCert = IntPtr.Zero;
        var pSubjectInfo = IntPtr.Zero;
        var pSignatureInfo = IntPtr.Zero;
        var pProviderInfo = IntPtr.Zero;


        pSignerCert = CreateSignerCert(cert);
        pSubjectInfo = CreateSignerSubjectInfo(appPath);
        pSignatureInfo = CreateSignerSignatureInfo();
        pProviderInfo = GetProviderInfo(cert);

           var hResult = NativeMethods.SignerSign(
                pSubjectInfo,
                pSignerCert,
                pSignatureInfo,
                pProviderInfo,
                null,
                IntPtr.Zero,
                IntPtr.Zero
                );

        Console.WriteLine(hResult);
    }

然后我得到这样的提供者信息:

  private static IntPtr GetProviderInfo(X509Certificate2 cert)
    {
        if (cert == null || !cert.HasPrivateKey)
        {
            return IntPtr.Zero;
        }

        var key = cert.PublicKey.Key as ICspAsymmetricAlgorithm;
        if (key == null)
        {
            return IntPtr.Zero;
        }

        var providerInfo = new SignerProviderInfo
                               {
                                   cbSize = (uint)Marshal.SizeOf(typeof(SignerProviderInfo)),
                                   pwszProviderName = "Microsoft Enhanced Cryptographic Provider v1.0",
                                   dwProviderType = 0x1,
                                   // PROV_RSA_FULL
                                   dwKeySpec = 0x0,
                                   dwPvkChoice = 0x2, //PVK_TYPE_KEYCONTAINER
                                   providerUnion = new SignerProviderInfo.ProviderInfoUnion
                                                       {
                                                           pwszKeyContainer = key.CspKeyContainerInfo.KeyContainerName
                                                       },
                               };
        var pProviderInfo = Marshal.AllocHGlobal(Marshal.SizeOf(providerInfo));
        Marshal.StructureToPtr(providerInfo, pProviderInfo, false);

        return pProviderInfo;
    }

问题是在某些机器上它工作得很好,但在其他一些机器上我收到以下错误:错误代码 0x80092006 - 没有为商店或对象指定提供程序。

我尝试将 SignTool.exe 与相同的 pfx 文件一起使用,它工作正常。

我试图调查可能导致此行为的原因,但我找不到任何有关此错误发生原因的提示。

有人知道为什么会这样吗?

【问题讨论】:

    标签: c# .net sign signtool


    【解决方案1】:

    供应商信息应该这样填写:

    // get private key information
    ICspAsymmetricAlgorithm key = (ICspAsymmetricAlgorithm)certificate.PrivateKey;
    const int PVK_TYPE_KEYCONTAINER = 2;
    
    var providerInfo = new SignerProviderInfo
    {
       cbSize = (uint)Marshal.SizeOf(typeof(SignerProviderInfo)),
       pwszProviderName = key.CspKeyContainerInfo.ProviderName,
       dwProviderType = (uint)key.CspKeyContainerInfo.ProviderType,
       dwPvkChoice = PVK_TYPE_KEYCONTAINER,
       providerUnion = new SignerProviderInfo.ProviderInfoUnion
       {
           pwszKeyContainer = key.CspKeyContainerInfo.KeyContainerName
       },
    };
    

    【讨论】:

      猜你喜欢
      • 2018-12-06
      • 2018-04-19
      • 2018-03-23
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 2011-11-27
      • 2018-04-24
      相关资源
      最近更新 更多