27 votes

Erreur WCF : "La construction de la chaîne de certificats X.509 CN=localhost a échoué ..."

J'obtiens cette erreur en essayant de faire mon client et serveur WCF parler l'un à l'autre.

La construction de la chaîne de certificats X.509 CN=localhost a échoué. Le site certificat utilisé a une chaîne de confiance qui ne peut pas être vérifiée. Remplacez le certificat ou modifiez le certificateValidationMode. A chaîne de certificats traitée, mais se terminant par un certificat racine qui n'est pas approuvé par le trust.

Tout fonctionne parfaitement si je désactive les certificats SSL.

28voto

Zane Points 576

J'ai résolu le problème en désactivant la validation dans mon code comme ceci :

client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = 
System.ServiceModel.Security.X509CertificateValidationMode.None;

Donde client est une instance de ma référence de service.

26voto

The_Smallest Points 3132

Il y a un problème avec votre certificat (je suppose que vous utilisez un certificat auto-signé). WCF essaie de vérifier toute la chaîne des émetteurs et s'attend à ce que la chaîne se termine finalement sur l'autorité de confiance racine. Pour désactiver cette vérification vous pourriez ajouter une telle ligne à la branche app.config. Mais cette "béquille" ne devrait pas être utilisée en production. serviceBehaviors/behavior/serviceCredentials/clientCertificate

<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck" />

5voto

saille Points 3585

La bonne chose à faire est de configurer votre propre certificat racine de confiance Dev/Test et signez vos certificats de client et de service avec ceci.

Le contournement de la confiance en chaîne dans votre environnement Dev/Test peut "fonctionner" mais votre environnement Dev/Test est maintenant configuré différemment de la production, ce qui n'est pas une bonne idée car vous pouvez constater que certains tests produisent des faux positifs ou des faux négatifs.

4voto

eswara amirthan s Points 107

Ajoutez le comportement du point de terminaison dans votre application client (par exemple, App.config) et définissez la configuration du comportement que vous avez ajouté dans le point de terminaison.

 <behaviors>
          <endpointBehaviors>
            <behavior name="certificateEndpointBehavior">
              <clientCredentials>
                <serviceCertificate>             
                  <authentication certificateValidationMode="None" revocationMode="NoCheck"/>
                </serviceCertificate>
                </clientCredentials>      
            </behavior>
          </endpointBehaviors>
        </behaviors>

<endpoint address="http://localhost/Invoice.svc" binding="wsHttpBinding"  bindingConfiguration="WsHttpBinding_ACKS" contract="Invoice" name="Invoice"
       behaviorConfiguration="certificateEndpointBehavior" >

</endpoint>

3voto

Dan7el Points 531

J'ai eu des difficultés avec ce même problème. J'utilisais l'échantillon CustomToken-VS2010 du WIF SDK.

L'échantillon n'a pas d'app.config et j'ai pensé qu'il était utile de savoir comment le code fonctionne de toute façon, alors j'ai passé du temps à étudier la question. Je pense que je devrais montrer mes résultats ici. J'espère que ces informations vous seront utiles.

J'ai eu le même problème. Le problème que j'avais était "où dois-je régler ce mode ?" J'ai eu du mal à trouver l'objet qui avait cette propriété à définir qui était en fait le bon objet. J'ai finalement trouvé qu'il faisait partie de l'objet ChannelFactory :

using System.ServiceModel.Security;
:
ChannelFactory<IEcho> echoChannelFactory = new ChannelFactory<IEcho>(...)
echoChannelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

Donc, l'endroit pour définir ceci est dans l'objet ChannelFactory.

En exécutant Visual Studio 2010 en tant qu'administrateur local, j'ai réussi à faire fonctionner l'échantillon (après avoir également exécuté le fichier batch associé à tous les échantillons pour créer le certificat, etc.)

Encore une fois, Ce n'est pas quelque chose que vous feriez dans un environnement de production. Mais savoir comment définir le mode d'authentification du certificat de service est probablement une bonne chose à savoir en général.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X