2009-08-14 20 views
2

Je développe un service Web WCF qui vérifie si un certificat en signature XML est valide. XML est signé avec un certificat X509 qualifié et valide. Pendant que j'exécute le service dans l'environnement de développement Visual Studio, les méthodes X509Certificate2.Verify() et X509Chain.Build() renvoient TRUE. Mais lorsque je publie mon service sous IIS, ces méthodes retournent FALSE. Qu'est-ce que je fais mal ou qu'est-ce qui manque? Voici mon code de validation:Validation X509Certificate2 sur le service Web

public static void VerifyXml(XmlDocument xDoc) 
    { 
     // Create a new SignedXml object and pass it 
     // the XML document class. 
     SignedXml signedXml = new SignedXml(xDoc); 

     // Find the "Signature" node and create a new 
     // XmlNodeList object. 
     XmlNodeList nodeList = xDoc.GetElementsByTagName("Signature"); 

     // Load the first <signature> node. 
     signedXml.LoadXml((XmlElement)nodeList[0]); 

     IEnumerable<KeyInfoX509Data> x509Data = signedXml.KeyInfo.Cast<KeyInfoX509Data>(); 
     KeyInfoX509Data info = x509Data.First<KeyInfoX509Data>(); 
     X509Certificate2 cert = info.Certificates[0] as X509Certificate2; 

     bool certIsValid = cert.Verify(); 
     // Here I receive TRUE in development environment and FALSE under IIS 
     if (!certIsValid) 
      throw new X509Exception("Invalid certificate"); 

     bool chainIsValid = false; 
     X509Chain chain = new X509Chain(); 
     chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain; 
     chain.ChainPolicy.RevocationMode = X509RevocationMode.Online; 
     chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 1, 0); 
     chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; 
     chainIsValid = chain.Build(cert); 
     // Here I also receive TRUE in development environment and FALSE under IIS 
     if (!chainIsValid) 
      throw new X509Exception("Chain is invalid"); 

     // Check the signature 
     bool signatureOK = signedXml.CheckSignature(cert, false); 
     if (!signatureOK) 
      throw new X509Exception("Signature is invalid"); 
    } 

Des idées? Remerciements

Répondre

4

Où se trouve le certificat racine? Je pense qu'ASP.NET utilisera le magasin de la machine locale - peut-être que le serveur de développement VS utilise le magasin de l'utilisateur et y trouve le certificat racine mais ASP.NET ne le trouve pas? Essayez d'ajouter le certificat racine au magasin de machines local.

Vous pouvez vérifier les statuts du X509Chain pour obtenir plus de détails:

foreach (X509ChainElement element in chain.ChainElements) 
{ 
    Console.WriteLine ("Element issuer name: {0}", element.Certificate.Issuer); 
    Console.WriteLine ("Element certificate valid until: {0}", element.Certificate.NotAfter); 
    Console.WriteLine ("Element certificate is valid: {0}", element.Certificate.Verify()); 
    Console.WriteLine ("Element error status length: {0}", element.ChainElementStatus.Length); 
    Console.WriteLine ("Element information: {0}", element.Information); 
    Console.WriteLine ("Number of element extensions: {0}{1}", element.Certificate.Extensions.Count, Environment.NewLine); 

    if (ch.ChainStatus.Length > 1) 
    { 
     for (int index = 0; index < element.ChainElementStatus.Length; index++) 
     { 
      Console.WriteLine (element.ChainElementStatus[index].Status); 
      Console.WriteLine (element.ChainElementStatus[index].StatusInformation); 
     } 
    } 
} 
+1

Ajout certificat racine au magasin de la machine locale a résolu le problème. Ça fait beaucoup! –