我正在尝试通过https访问一个公共托管的SOAP Web服务(不是WCF),但我遇到了一个以前从未见过的错误。以下是事实:
- 此服务需要客户端证书。我有一个由与服务器证书签名相同的CA签署的证书。
- 我知道URL可用,因为我可以在Internet Explorer中访问它。 IE弹出“选择证书”窗口,如果我选择它(并忽略服务器主机名与证书不匹配的错误),它会继续并给我HTTP 500错误。
- 如果我在Chrome中打开该站点,在选择证书并忽略错误后,我会收到有关WSA Action = null的常规错误消息。
- 如果我在FireFox中打开该站点,在忽略错误后,我会收到有关服务器无法验证我的证书的页面。它从未要求我选择证书,所以这是完全合理的。
现在,这个异常:
Error occurred while executing test 12302: System.ServiceModel.Security.SecurityNegotiationException: Could not establish secure channel for SSL/TLS with authority 'ihexds.nist.gov:9085'. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
我使用了WireShark来跟踪交互,但由于我不是TLS协议方面的专家,可能会错过一些提示。然而,以下是我看到的:
- C -> S 客户端Hello
- 包含随机数、日期/时间、支持的加密套件等内容
- S -> C 服务器Hello、证书、证书请求、服务器Hello Done
- 包含服务器的证书和对客户端证书的请求
- C -> S 证书、客户端密钥交换、更改密码规范、加密握手消息
- 这里是有趣的部分-- 这个数据包的第一部分是证书握手,我假设客户端证书应该在其中,但没有证书出现(证书长度:0)。
- S -> C 警报(级别:致命,描述:错误的证书)
- 嗯,确实没有发送证书。
我的绑定设置如下:
<binding name="https_binding">
<textMessageEncoding />
<httpsTransport useDefaultWebProxy="false" />
</binding>
我的行为设置如下:
<behavior name="clientcred">
<clientCredentials>
<clientCertificate findValue="69b6fbbc615a20dc272a79caa201fe3f505664c3" storeLocation="CurrentUser" storeName="My" x509FindType="FindByThumbprint" />
<serviceCertificate>
<authentication certificateValidationMode="None" revocationMode="NoCheck" />
</serviceCertificate>
</clientCredentials>
<messageInspector />
</behavior>
我的端点设置为同时使用绑定和行为。为什么 WCF 在创建 HTTPS 连接时,拒绝发送证书?