WCF错误:“X.509证书CN = localhost链构建失败...”

时间:2010-11-23 13:33:00

标签: wcf ssl-certificate

我在尝试让我的WCF客户端和服务器相互通信时遇到此错误。

  

X.509证书CN = localhost链构建失败。该   使用的证书具有无法验证的信任链。   替换证书或更改certificateValidationMode。一个   证书链已处理,但已在根证书中终止   信托不信任。

如果我关闭SSL证书,一切都会完美。

8 个答案:

答案 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日志中的条目相关联。