我在Visual Studio 2013中编写了一个asmx Web服务。 WS使用HTTPS和X.509连接到提供程序进行身份验证。
我尝试使用“basicHttpBinding”和“basicHttpsBinding”(Web.config)进行连接,但总是会收到以下错误。
错误:System.ServiceModel.Security.SecurityNegotiationException:无法为具有权限“www.providers-site.se”的SSL / TLS建立安全通道。 ---> System.Net.WebException:请求已中止:无法创建SSL / TLS安全通道。在System.Net.HttpWebRequest.GetResponse()at ....
我已经为X.509创建了一个行为,并为端点创建了一个绑定,见下文。 我究竟做错了什么? 我会从使用wsHttpBinding中获益吗?
<behaviors>
<endpointBehaviors>
<behavior name="CertBehaviour">
<clientCredentials>
<clientCertificate findValue="MyCertCN" storeLocation="LocalMachine"
storeName="My" x509FindType="FindBySubjectName" />
<serviceCertificate>
<authentication certificateValidationMode="PeerTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
...
<basicHttpsBinding>
<binding name="mySoapBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate" />
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpsBinding>
...
<client>
<endpoint address="https://www.providers-site.se/na/na_epersondata/services/personpostXML"
behaviorConfiguration="CertBehaviour" binding="basicHttpsBinding"
bindingConfiguration="mySoapBinding" contract="webservice.NaPersonPostXMLWS"
name="personpostXML" />
</client>
我确实跑了一下。感谢Mike Cheel! See trace here.
此跟踪是否表示远程主机(提供商)不接受证书? (第67-71行) (由于“AUTHENTICATE_REQUEST NOTIFICATION_CONTINUE”和“AnonymousAuthenticationModule”在证书认证后启动。)
CertificateMappingAuthenticationModule NOTIFY_MODULE_START RequestNotifications AUTHENTICATE_REQUEST
AUTH_START Authentication MapCliCert
AUTH_END Authentication
CertificateMappingAuthenticationModule NOTIFY_MODULE_END RequestNotifications AUTHENTICATE_REQUEST NOTIFICATION_CONTINUE
AnonymousAuthenticationModule NOTIFY_MODULE_START RequestNotifications AUTHENTICATE_REQUEST
答案 0 :(得分:1)
确保您在asmx计算机的受信任根存储中拥有providers-site服务的证书链。你可以通过输入你的浏览器来找到:
https://www.providers-site.se/na/na_epersondata/services/personpostXML
并查看其证书链。浏览器也会显示警告。
暂时解决证书错误的另一个选择是试试这个:
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
{
// put a breakpoint here
var tempSslErrors = sslPolicyErrors;
return true;
}
如果你看sslPolicyErrorsit
可能会给出一些指示。