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
Ajout certificat racine au magasin de la machine locale a résolu le problème. Ça fait beaucoup! –