web-dev-qa-db-fra.com

Erreur WCF: "Le certificat X.509 CN = la construction de la chaîne d'hôte local a échoué ..."

Je reçois cette erreur en tentant de faire communiquer mon client et mon serveur WCF. 

Le certificat X.509 CN = la construction de la chaîne d'hôte local a échoué. Le le certificat utilisé a une chaîne de confiance qui ne peut pas être vérifiée . Remplacez le certificat ou modifiez le certificateValidationMode. UNE chaîne de certificats traitée, mais terminée par un certificat racine qui ne fait pas confiance à la confiance.

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

36
Contango

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 d'émetteurs et s'attend à ce que cette chaîne s'achève sur une autorité de confiance racine. Pour désactiver cette vérification, vous pouvez ajouter cette ligne à la branche app.config. Mais cette "béquille" ne doit pas être utilisée en production serviceBehaviors/behavior/serviceCredentials/clientCertificate

 <authentication certificateValidationMode = "PeerOrChainTrust" revocationMode = "NoCheck" />
31
The Smallest

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;

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

38
Zane

La bonne chose à faire est de configurer votre propre certificat racine de développement/de test et de signer vos certificats de client et de service avec ceci.

Ignorer la confiance de la chaîne dans votre environnement de développement/test peut "fonctionner", mais votre environnement de développement/test est maintenant configuré différemment de Production, ce qui n’est pas une bonne idée, car certains tests peuvent produire des faux positifs ou des faux négatifs.

7
saille

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

L'échantillon n'a pas d'app.config et j'ai eu le sentiment qu'il était utile de savoir comment fonctionne le code, alors j'ai passé un peu de temps à enquêter sur cela. Je pense que je devrais montrer mes résultats ici. J'espère que cette information est utile.

J'ai eu le même problème. Le problème que j'ai eu était "où dois-je définir ce mode?" J'ai eu du mal à trouver l'objet qui avait cette propriété à définir qui était en fait le bon objet. Je l'ai finalement trouvé dans le cadre de 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 pu obtenir le bon fonctionnement de l'exemple (après avoir également exécuté le fichier de commandes associé à tous les exemples 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 très bonne chose à savoir en général.

3
Dan7el

Ajoutez un comportement de point de terminaison dans votre application client (par exemple: App.config) et définissez la configuration de comportement que vous avez ajoutée au 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>
3
eswara amirthan s

Lors de la désactivation de revocationMode, il vous manque probablement une liste de révocation de clients pour votre autorité de certification racine.

makecert -crl -n "CN=CARoot" -r -sv CARoot.pvk CARoot.crl

Cela doit également être importé vers les autorités de certification racine de confiance. Voir aussi ma réponse ici .

1
toATwork

Suite au commentaire ci-dessus d'Aseiu, j'ai constaté que la même erreur ci-dessus sera générée lorsque le certificat est absent de la banque sécurisée sur le serveur. En effectuant des recherches sur le problème, j'ai également constaté que l'observation de l'observateur d'événements sous Windows Logs/Application contiendrait une erreur détaillant le certificat avec lequel le problème se posait. Vous pouvez également corréler le journal d'activité avec les entrées du journal SVC du service.

0
Joe Mierwa

(Je pensais partager cela au cas où cela ferait gagner un peu de temps à quelqu'un) J'ai rencontré ce problème lors de l'exécution d'une application Web sur WIF. J'ai résolu mon problème en déplaçant une copie du certificat x.509 avec lequel je travaillais du dossier "Certificats/personnels/certificats" vers le dossier "Autorités de certification racines de confiance/Certificats" dans le magasin de certificats. Vous pouvez le faire en exécutant la console de gestion Microsoft

0
Aseiu P