设置
WCF服务是使用basicHttpsBinding自托管的,安全模式设置为Transport,clientCredentailType设置为Certificate(相互认证)。所有必需的证书都安装在服务器上。 sslcert和urlacl均已正确执行。协商客户端证书设置为已启用。
<system.serviceModel>
<services>
<service name="ServiceName" behaviorConfiguration="behaviorConfiguration">
<endpoint name="EndpointName"
address="https://localhost/service.svc"
binding="basicHttpsBinding"
bindingConfiguration="httpsBinding"
contract="IServiceContract">
</endpoint>
</service>
</services>
<bindings>
<basicHttpsBinding>
<binding name="httpsBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpsBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="behaviorConfiguration">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
<serviceDebug
includeExceptionDetailInFaults="false"
httpHelpPageEnabled="false"
httpsHelpPageEnabled="false" />
<serviceCredentials>
<clientCertificate>
<authentication
certificateValidationMode="ChainTrust"
trustedStoreLocation="LocalMachine" />
</clientCertificate>
<serviceCertificate
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindByThumbprint"
findValue="certificate_thumbprint" />
</serviceCredentials>
<serviceSecurityAudit
auditLogLocation="Application"
messageAuthenticationAuditLevel="SuccessOrFailure"
serviceAuthorizationAuditLevel="SuccessOrFailure" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Azure负载平衡器的运行状况探针为tcp / 443,单个负载平衡规则为tcp / 443。
问题
一次成功的请求/响应将发生。通过基于serviceSecurityAudit中的配置查看事件日志,可以验证MessageAuthentication和ServiceAuthorization是否成功。
大约2分钟后,将进行后续调用,但是这次WCF将抛出一个异常详细信息,“需要客户端证书。在请求中找不到证书...”。
我已启用跟踪,并且可以验证与源建立连接后将近2分钟发生了异常。下面的跟踪图像显示连接始于12:59:43,但错误发生于13:01:48
更深入地研究跟踪,我发现在2分钟的时间范围内使用相同的源ip和端口时会发生此问题。
在同一时间窗口中,我使用了Azure的数据包捕获功能来查看它是否可以提供更多详细信息。它本质上显示的是同一件事。
我不知道随后的请求失败的确切原因是什么。是否有一些WCF超时需要调整? Azure负载平衡器是否有问题?这是tcp连接池问题(connectionPoolSettings)吗?
如果有人遇到类似问题或知道如何进一步调试/跟踪该问题,我将不胜感激。
最后,禁用相互身份验证不会遇到相同的问题。但是,这不是一个选择。