Ошибка SignerSign. Поставщик не указан для магазина или объекта.

Я разрабатываю приложение C# .net 3.5 (скомпилировано для anycpu)

Мне нужно подписать исполняемый файл. Я попытался использовать код здесь с некоторыми изменениями. Я не искал сертификат в магазине, вместо этого я загрузил его в файл 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, и он работает нормально.

Я попытался выяснить, что может вызвать это поведение, но я не мог найти никакого намека на то, что эта ошибка происходит.

Кто-нибудь знает, почему это может случиться?

1
nl ja de

2 ответы

информация поставщика должна быть заполнена следующим образом:

// 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
   },
};
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
   },
};
1
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot