2010-11-23 13 views
36

Recibo este error al intentar hacer que mi cliente y servidor WCF hablen entre sí.WCF error: "El certificado X.509 CN = localhost chain building failed ..."

The X.509 certificate CN=localhost chain building failed. The certificate that was used has a trust chain that cannot be verified. Replace the certificate or change the certificateValidationMode. A certificate chain processed, but terminated in a root certificate which is not trusted by the trust.

Todo funciona perfectamente si desactivo los certificados SSL.

Respuesta

30

Existe un problema con su certificado (supongo que utiliza un certificado autofirmado) WCF intenta verificar toda la cadena de emisores y espera que finalmente la cadena termine en la autoridad de confianza de la raíz. Para deshabilitar esa comprobación, podría agregar dicha línea a la rama app.config. Pero esta "muleta" no debe ser utilizado en la producción serviceBehaviors/behavior/serviceCredentials/clientCertificate

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

Genial, funciona perfectamente ahora. Tienes razón, estaba usando un certificado auto firmado. El otro truco crucial para solucionar este error fue cambiar "NegotiateServiceCredential" por "falso", en app.config, utilizando el Editor de configuración de servicios de Microsoft. – Contango

+0

Disculpe mi ignorancia: ¿se supone que esta línea irá del lado del cliente o del servidor? ¿Y en qué sección de app.config? –

+3

La sección @Shaul es serviceBehaviors/behavior/serviceCredentials/clientCertificate Debe agregar esto a Server.config –

34

He arreglado el problema desactivando la validación en mi código como este:

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

Dónde client es una instancia de mi referencia de servicio .

+5

. Esto también funcionó, cambiar el web.config no lo hizo. Tenga en cuenta que esto nunca debe llegar a su entorno de producción. – stvn

+0

¿en qué parte de tu código pusiste esto? – Jarrette

+6

Tuve que agregar la referencia "System.IdentityModel" al proyecto del cliente para compilarlo – Softec

3

Tuve algunas dificultades con este mismo problema exacto. Estaba usando la muestra CustomToken-VS2010 del WIF SDK.

La muestra no tiene un app.config y creo que saber cómo funciona el código es útil de todos modos, así que dediqué un tiempo a investigar esto. Siento que debería mostrar mis resultados aquí. Espero que esta inforamation sea útil.

Tuve el mismo problema. El problema que tuve fue "¿dónde configuro este modo?" Tuve un momento difícil para encontrar el objeto que tenía esta propiedad para establecer que en realidad era el objeto correcto. Finalmente lo encontré como parte de la ChannelFactory:

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

Por lo tanto, el lugar para establecer este está en el objeto ChannelFactory.

ejecutar Visual Studio 2010 como administrador local, que fue capaz de obtener la muestra para trabajar (después de tener también ejecutar el archivo por lotes asociados con todas las muestras para crear el certificado, etc.)

Una vez más, esto no es algo que haría en un entorno de producción, pero saber cómo configurar el modo de autenticación del certificado de servicio es probablemente una muy buena cosa para saber en general.

+0

Si debe utilizarse 'ChannelFactory .Credentials' o' ClientBase .ClientCredentials' depende de si está utilizando explícitamente una fábrica de canales (con proxy dinámico) o el proxy generado que fue creado por algún generador de códigos (por ejemplo, mediante la adición de un servicio referencia a través de VS-GUI). – CodeFox

7

Lo correcto es hacer setup your own Dev/Test Trusted Root Certificate y firmar sus certificados de cliente y servicio con esto.

Anulando la confianza de la cadena en su entorno Dev/Test puede "funcionar" pero su entorno Dev/Test ahora está configurado de forma diferente a Production, lo cual no es una gran idea, ya que algunas pruebas pueden producir falsos positivos o falsos negativos.

3

Agregue comportamiento de punto final en su aplicación cliente (por ejemplo, App.config) y establezca la configuración de comportamiento que agregó en el punto final.

<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> 
+1

Esta es la solución correcta. Ni siquiera necesita preocuparse por configurar el 'certificateValidationMode'. Solo se necesita el modo de revocación. Establecer los valores en el lado del servidor no funciona. Hackear cada extremo del cliente en el código es demasiado trabajo. –

0

(pensé que podría compartir esto sólo en caso de que alguien por ahí ahorra algo de tiempo) me encontré con este problema mientras se ejecuta una aplicación web en WIF. Solucioné mi problema moviendo una copia del certificado x.509 con el que estaba trabajando desde la carpeta "Certificados/personales/certificados" a la carpeta "Autoridades de certificación raíz de confianza/Certificados" dentro del almacén de certificados.Puede hacerlo ejecutando la consola de administración de Microsoft

0

Siguiendo con el comentario anterior de Aseiu, descubrí que el mismo error exactamente anterior se emitirá cuando falte el certificado de la tienda de confianza en el servidor. Al investigar el problema, también encontré que al mirar el visor de eventos en Windows Logs/Application contendrá un error que detalla el certificado con el que está teniendo un problema. También puede correlacionar el registro de actividad con las entradas en el registro de SVC para el servicio.

1

Al desactivar el método revocationMode, es muy probable que le falte una lista de revocación del cliente para su CA raíz.

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

Esto también debe importarse a las autoridades de certificación raíz confiables. Vea también my answer here.

Cuestiones relacionadas