2010-11-23 94 views
36

我在尝试让我的WCF客户端和服务器彼此通话时出现此错误。WCF错误:“X.509证书CN = localhost链式构建失败...”

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.

如果关闭SSL证书,一切正常。

回答

30

你的证书存在问题(我想你使用自签名证书)WCF试图验证所有的发行者链和期望,最终链将结束在根可信任的权威。要禁用该检查,您可以将此行添加到app.config分支。但这种“拐杖”不应该在生产中使用serviceBehaviors/behavior/serviceCredentials/clientCertificate

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

太棒了,它现在完美。你说得对,我正在使用自签名证书。修复此错误的另一关键技巧是使用Microsoft Service Configuration Editor在app.config中将“NegotiateServiceCredential”切换为“false”。 – Contango 2010-11-23 16:18:37

+0

请原谅我的无知 - 这条线应该放在客户端还是服务器端?并在哪个部分的app.config? – 2010-12-27 12:38:36

+3

@Shaul节是serviceBehaviors/behavior/serviceCredentials/clientCertificate您应该将此添加到服务器的app.config – 2010-12-27 14:37:26

34

我通过关闭验证在我的代码是这样解决了这一问题:

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

client是我服务的参考实例。

3

我在这个相同的问题上遇到了一些困难。我正在使用WIF SDK中的CustomToken-VS2010示例。

该示例没有app.config,我觉得知道代码是如何工作的非常有用,所以我花了一些时间来研究这一点。我觉得我应该在这里展示我的结果。我希望这个信息是有帮助的。

我有同样的问题。我遇到的问题是“我在哪里设置此模式?”我很难找到具有这个属性的对象,这个对象实际上是正确的对象。我终于找到了它作为的ChannelFactory的一部分:

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

因此,要设置这个地方是的ChannelFactory对象。

运行Visual Studio 2010为本地管理员,我能得到样品的工作(有也跑了所有的样本有关的批处理文件来创建证书等之后)

再次,这不是在生产环境中要做的事情,但知道如何设置服务证书身份验证模式可能是了解整体情况的一件好事。

7

要做的正确的事情是setup your own Dev/Test Trusted Root Certificate并用此签名您的客户端和服务证书。

在开发/测试环境中绕过链式信任可能“有效”,但您的开发/测试环境现在配置与生产不同,这不是一个好主意,因为您可能会发现某些测试会产生误报或漏报。

3

在您的客户端应用程序(例如:App.config)中添加终端行为并设置您添加到终端中的行为配置。

<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> 
0

(以为我会分享这个以防万一它可以节省有人在那里一段时间),我遇到了这个问题,同时运行在WIF的Web应用程序。我解决了我的问题,将我正在使用的x.509证书的副本从“证书/个人/证书”文件夹移动到证书存储区内的“受信任的根证书颁发机构/证书”文件夹。您可以通过运行Microsoft管理控制台执行此操作

0

继上面Aseiu的评论之后,我发现当服务器中的可信存储缺少证书时,会输出上述完全相同的错误。在研究这个问题时,我还发现,通过查看Windows下的事件查看器,日志/应用程序将包含一个错误,详细说明它遇到问题的证书。您还可以将活动日志与服务的SVC日志中的条目关联起来。

1

当停用revocationMode帮助时,很可能您错过了您的根CA的客户端撤销列表

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

这也需要导入到受信任的根证书颁发机构。另见my answer here