2011-08-18 4 views
0

J'ai un certificat de signature de code de Thawte que j'utilise pour générer et signer dynamiquement des manifestes de déploiement ClickOnce. Le problème est que l'application ASP.NET qui génère et signe ces manifestes fonctionne très bien quand on va redémarrer IIS ou réimporter le certificat de signature, mais au fil du temps la fonction suivante ne trouve pas le certificat:Certificat stocké dans le magasin de certificats disparaissant de l'application ASP.NET au fil du temps

private static X509Certificate2 GetSigningCertificate(string thumbprint) 
{ 
    X509Store x509Store = new X509Store(StoreLocation.CurrentUser); 
    try 
    { 
     x509Store.Open(OpenFlags.ReadOnly); 
     X509Certificate2Collection x509Certificate2Collection = x509Store.Certificates.Find(
      X509FindType.FindByThumbprint, thumbprint, false); 

     if (x509Certificate2Collection.Count == 0) 
      throw new ApplicationException(
       "SigningThumbprint returned 0 results. Does the code signing certificate exist in the personal store?", 
       null); 

     if (x509Certificate2Collection.Count > 1) 
      throw new ApplicationException(
       "SigningThumbprint returned more than 1 result. This isn't possible", null); 

     var retval = x509Certificate2Collection[0]; 

     if(retval.PrivateKey.GetType() != typeof(RSACryptoServiceProvider)) 
      throw new ApplicationException("Only RSA certificates are allowed for code signing"); 

     return retval; 
    } 
    finally 
    { 
     x509Store.Close(); 
    } 
} 

Finalement, le l'application commence à lancer des erreurs qu'elle ne peut pas trouver le certificat. Je suis perplexe parce que je pense que le CERT est installé correctement (ou plutôt correct) parce qu'il trouve le CERT quand nous démarrons l'application ASP.NET, mais à un certain moment nous frappons la branche Count == 0 et ce n'est pas vrai: le certificat se trouve dans le magasin de certificats "Current User \ Personal" de l'utilisateur du pool d'applications. Question: Pourquoi un cert peut-il soudainement «disparaître» ou ne pas être retrouvé?

Répondre

1

Compris par nous-mêmes (douloureusement).

Le certificat doit être installé dans le magasin LocalMachine et le compte du pool d'applications doit lire les autorisations au certificat à l'aide de WinHttpCertCfg ou de CACLS.exe s'il doit être utilisé à partir d'une application ASP.NET. L'utilisation du magasin CurrentUser du compte exécutant le pool d'applications causait le problème. Je suppose qu'il existe une sorte de condition de concurrence ou quelque chose qui n'est pas vraiment cool à propos de l'accès au magasin CurrentUser à partir d'un utilisateur qui ne s'exécute pas dans une session d'ouverture de session interactive. Nous n'avons pas pu faire cela au début parce que nous appelions l'outil MAGE pour effectuer la création/signature du manifeste de déploiement ClickOnce et que le certificat de signature de code devait se trouver dans le magasin CurrentUser \ My. Cependant, nous avons éliminé le besoin de MAGE en a) créant le manifeste à partir d'un fichier modèle et en remplaçant les valeurs que nous devons substituer et b) en signant le manifeste en appelant le code appels MAGE via la réflexion qui existe dans les BuildTasks. v3.5 DLL. En conséquence, nous avons plus de contrôle sur ce que nous utilisons pour signer le manifeste et pouvons le mettre où nous voulons. Sinon, nous serions coincés si nous n'avions pas fait un petit "niveau inférieur".

Questions connexes