我有一个 REST 网络服务,它使用 WCF 客户端调用外部 SOAP 网络服务。此 REST Web 服务托管在我们测试环境中的 IIS 中。当调用 REST web 服务时,后者调用外部 web 服务(使用 WCF 客户端),在 IIS 中重新启动 REST web 服务后,WCF 客户端的第一次调用会抛出SecurityNegotiationException。对 REST Web 服务的第二次调用以及间接调用和所有后续调用均成功。为了说明这一点,这里有一张图片:此SecurityNegotiationException如下所示:System.ServiceModel.Security.SecurityNegotiationException:无法为具有权限“X”的 SSL/TLS 建立安全通道。---> System.Net.WebException:请求被中止:无法创建 SSL/TLS 安全通道。端点和绑定如下(通过添加服务引用生成,稍微修改了customBinding):<endpoint address="https://..." binding="customBinding" bindingConfiguration="MyBinding" contract="WS_..." name="MyEndpoint" />...<customBinding> <binding name="MyBinding"> <textMessageEncoding messageVersion="Soap11" /> <security authenticationMode="UserNameOverTransport" /> <httpsTransport requireClientCertificate="true" /> </binding></customBinding>调用外部webservice的代码:MyEndpointClient client = new MyEndpointClient("MyEndpoint");client.ClientCredentials.UserName.UserName = authInfo.Username;client.ClientCredentials.UserName.Password = authInfo.Password;client.ClientCredentials.ClientCertificate.Certificate = authInfo.Certificate;var result = client.requestInformation(parameters); // This fails the first time after IIS restart.authInfo.Certificate 正在加载如下:authInfo.Certificate = new X509Certificate2(certificateBytes, certificatePassword);
1 回答
慕标5832272
TA贡献1966条经验 获得超4个赞
出于某种原因,这仅发生在一台测试服务器上,而不发生在其他服务器上。对外部 SOAP 网络服务调用的跟踪日志显示内部函数AcquireCredentialsHandle失败并显示错误代码0X8009030D。
经过更多调查,我发现了安装在相关服务器上的几个证书(来自外部 SOAP 网络服务)。它们似乎与对外部 SOAP 网络服务的调用相冲突。删除这些证书后,第一次调用现在成功了!
更新:我再次遇到同样的问题,但现在在我的开发机器上。清除证书无济于事,所有请求都失败并出现相同的SecurityNegotiationException。为了解决这个问题,我为 HTTP 100 状态代码添加了一个传递,并强制连接到 TLS 1.2:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
请注意,我在初始化 WCF 客户端(问题帖子中的MyEndpointClient)之前添加了此代码,以确保 WCF 客户端使用这些设置。
- 1 回答
- 0 关注
- 353 浏览
添加回答
举报
0/150
提交
取消