我在尝试让我的WCF客户端和服务器相互通信时遇到此错误。
X.509证书CN = localhost链构建失败。该 使用的证书具有无法验证的信任链。 替换证书或更改certificateValidationMode。一个 证书链已处理,但已在根证书中终止 信托不信任。
如果我关闭SSL证书,一切都会完美。
答案 0 :(得分:39)
我通过在代码中关闭验证来解决问题:
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode =
System.ServiceModel.Security.X509CertificateValidationMode.None;
client
是我的服务参考的实例。
答案 1 :(得分:32)
您的证书存在问题(我认为您使用的是自签名证书)WCF会尝试验证所有发布者链并期望最终链将终止于根受信任的权限。要禁用该检查,您可以将此行添加到app.config分支。但是这个“拐杖”不应该用于制作serviceBehaviors/behavior/serviceCredentials/clientCertificate
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck" />
答案 2 :(得分:7)
正确的做法是setup your own Dev/Test Trusted Root Certificate并用此签署您的客户和服务证书。
绕开您的开发/测试环境中的链信任可能“有效”,但您的开发/测试环境现在配置与生产不同,这不是一个好主意,因为您可能会发现某些测试会产生误报或漏报。
答案 3 :(得分: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,我能够使样本生效(在运行与所有样本关联的批处理文件以创建证书等之后)。
同样, 这不是你在生产环境中要做的事情 ,但是知道如何设置服务证书身份验证模式可能是一件非常好的事情。
答案 4 :(得分: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>
答案 5 :(得分:1)
当取消激活revocationMode时,很可能您缺少根CA的客户端吊销列表。
makecert -crl -n "CN=CARoot" -r -sv CARoot.pvk CARoot.crl
还需要将其导入受信任的根证书颁发机构。另请参阅my answer here。
答案 6 :(得分:0)
(以为我会分享这个以防万一有人在那里节省一些时间)我在WIF上运行Web应用程序时遇到了这个问题。我通过移动我正在使用的x.509证书的副本来解决我的问题。证书/个人/证书&#34;文件夹到&#34;受信任的根证书颁发机构/证书&#34;证书库中的文件夹。您可以通过运行microsoft管理控制台
来完成此操作答案 7 :(得分:0)
继上述Aseiu的评论之后,我发现当服务器中的可信存储缺少证书时,将输出上面完全相同的错误。在研究这个问题时,我还发现通过查看Windows日志/应用程序下的事件查看器将包含一个错误,该错误详细说明了它遇到问题的证书。您还可以将活动日志与服务的SVC日志中的条目相关联。