具有相互身份验证证书的WCF Web服务在客户端链信任验证中失败



我正在为WCF web服务开发一个概念验证,该服务使用SSL和证书进行相互身份验证。

因此,我有两个证书,都是由有效的认证机构提供的(这些是生产证书,而不是开发证书)。以下是证书的连锁店和存储位置:

服务器证书链

  • 颁发者根CA
    • 中级1 CA
      • 服务器身份验证证书

我不知道这个细节是否重要:服务器证书是域(*.mydomain.com)的通配符证书

客户端证书链

  • 颁发者根CA
    • 中级2 CA
      • 客户端身份验证证书

颁发者根CA是两个证书的通用根CA

中介机构证书是不同的

店铺位置

颁发者根CA已导入服务器和客户端计算机上的受信任的根CA中间CA 1&2已导入服务器和客户端上的中间CA颁发者证书和中间证书都只有公钥。

服务器证书已导入服务器机器上的个人。这个证书有一个私钥。服务器证书已导入客户端机器上的个人。此证书只有一个公钥。客户端身份验证证书已导入服务器和客户端计算机上的Personal中。这两个证书都有私钥。

我创建了一个简单的WCF应用程序项目,该项目托管在具有C#4.0框架的IIS 8.5中。我在项目创建时使用默认提供的示例类,我刚刚将其重命名为DemoService.svc。然后,我创建了客户端(我为目标用户使用了一个winform应用程序,使其具有查看结果的图形界面),并添加了web服务引用。

然后,我修改了服务配置以设置相互身份验证。所有操作都通过web.config完成:

<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="demoServiceBehavior">
<serviceAuthorization principalPermissionMode="UseWindowsGroups"></serviceAuthorization>
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceCredentials>
<serviceCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" findValue="*.mydomain.com"/>
<clientCertificate>
<authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck" mapClientCertificateToWindowsAccount="true"
trustedStoreLocation="LocalMachine"/>
<certificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"
findValue="myservice.mydomain.com"/>
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="demoServiceBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate"></transport>
</security>
</binding>
</basicHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
<serviceActivations>
<add service="WcfMutualAuthenticationServiceDemo.DemoService" relativeAddress="DemoService.svc" />
</serviceActivations>
</serviceHostingEnvironment>
<services>
<service name="WcfMutualAuthenticationServiceDemo.DemoService" behaviorConfiguration="demoServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="https://myservice.mydomain.com/"/>
</baseAddresses>
</host>
<endpoint name="demoServiceEndpoint"
address=""
binding="basicHttpBinding"
bindingConfiguration="demoServiceBinding"
contract="WcfMutualAuthenticationServiceDemo.IDemoService"></endpoint>
</service>
</services>
</system.serviceModel>

我修改了客户端配置以设置相互身份验证:

<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="demoClientBehavior">
<clientCredentials>
<clientCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"
findValue="myservice.dekra-automotivesolutions.com"/>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="demoClientBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate"></transport>
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://myservice.mydomain.com/DemoService.svc"
behaviorConfiguration="demoClientBehavior"
binding="basicHttpBinding"
bindingConfiguration="demoClientBinding"
contract="DemoServiceValidReference.IDemoService"
name="demoServiceEndpoint" />
</client>
</system.serviceModel>

当我通过客户端调用web服务时,它会返回一个异常:

System.ServiceModel.Security.SecurityNegotiationException:无法与权威机构建立SSL/TLS的安全通道"myservice.mydomain.com"。--->System.Net.WebException:请求已中止:无法创建SSL/TLS安全通道。位于System.Net.HttpWebRequest.GetResponse()位于System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChanelRequest.WWaitForReply(TimeSpan超时)---内部异常堆栈跟踪结束---

经过调查,我在服务器的事件查看器中发现了一个条目:

处理异常。异常详细信息:System.IdentityModel.Tokens.SecurityTokenValidationException:X.509证书CN=myservice.mydomain链构建失败。这个所使用的证书具有无法验证的信任链。替换证书或更改certificateValidationMode。A.证书链处理正确,但其中一个CA策略提供程序不信任证书。

在System.IdentityModel.Selectors.X509CertificateChain.Build(X509Certificate2证书)System.IdentityModel.Selectors.X509CertificateValidator.ChainTrustValidator.Valide(X509Certificate2证书)System.IdentityModel.Selectors.X509SecurityTokenAuthenticator.ValideTokenCore(SecurityToken令牌)System.IdentityModel.Selectors.SecurityTokenAuthenticator.ValideToken(SecurityToken令牌)System.ServiceModel.Channels.HttpsChannelListener1.CreateSecurityProperty(X509Certificate2 certificate, WindowsIdentity identity, String authType) at System.ServiceModel.Channels.HttpsChannelListener1.进程身份验证(IHttpAuthenticationContextauthenticationContext)System.ServiceModel.Activation.HostedHttpContext.OnProcessAuthentication()在System.ServiceModel.Channels.HttpRequestContext.ProcessAuthentication()在System.ServiceModel.Channels.HttpChannelListener1.HttpContextReceivedAsyncResult1.身份验证()在System.ServiceModel.Channels.HttpChannelListener1.HttpContextReceivedAsyncResult1.ProcessHttpContextAsync()

关于这个异常,我发现问题出在客户端身份验证证书的链验证上,但我不知道为什么。在这一点上,我被卡住了!我不知道我的证书出了什么问题,也不知道如何找到解决方案。

我真的希望有人能帮我解决这个问题。

编辑:我们已经用另一个客户端证书测试了证书链在服务器和客户端证书上的相同性,它不会改变任何内容。

今天找到了解决方案:客户端和服务器上的配置都可以。IIS服务器证书映射上的配置错误,未配置但未启用功能。

最新更新