2013-01-09 5 views
1

Je développe une application C# .net 3.5 (compilé anycpu)erreur SignerSign - Aucun fournisseur n'a été spécifié pour le magasin ou un objet

je dois signer un exécutable. J'ai essayé d'utiliser le code dans here avec quelques modifications. Je ne cherchais pas le certificat dans le magasin, au lieu que je l'a chargé de former un fichier PFX:

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

Et le changement signe de méthode comme ceci:

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

et je reçois le fournisseur informations comme ceci:

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

la question est que sur certaines machines, il fonctionne parfaitement ok, mais sur une autre machine que je reçois l'erreur suivante: code d'erreur 0x80092006 - Aucun fournisseur était spécifié pour le magasin ou l'objet.

J'ai essayé d'utiliser SignTool.exe avec le même fichier pfx et cela fonctionne bien.

J'ai essayé d'étudier ce qui pouvait provoquer ce comportement, mais je n'ai trouvé aucun indice pour savoir si cette erreur se produisait.

Est-ce que quelqu'un sait pourquoi cela peut arriver?

Répondre

1

info fournisseur doit être rempli comme ceci:

// 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 
    }, 
}; 
Questions connexes