我正在从Windows服务进行Web服务调用。 Web服务将使用SSL,因此Web服务的URL为https://myclient.mydomain.com:4443/app/webservices/webservice.asmx
由于其他原因,正在使用4443而不是443。我可以浏览到这个URL,它工作正常。证书是从GlobalSign购买的,是通配符证书* .mydomain.com
浏览网络服务没有任何问题。
当我从Windows服务拨打电话时,它无法正常工作。使用System.Net.Trace我能够获得以下信息。虽然浏览器运行良好,但似乎.NET无法正常使用通配符证书。还有其他人经历过这个吗?
[Subject]
CN=*.mydomain.com, OU=Domain Control Validated
Simple Name: *.mydomain.com
DNS Name: mydomain.com
[Issuer]
CN=AlphaSSL CA - G2, O=AlphaSSL
Simple Name: AlphaSSL CA - G2
DNS Name: AlphaSSL CA - G2
System.Net Information: 0 : [2688] SecureChannel#48611003 - Remote certificate has errors:
ProcessId=8676
DateTime=2014-08-21T20:58:13.4998725Z
System.Net Information: 0 : [2688] SecureChannel#48611003 - Certificate name mismatch.
ProcessId=8676
DateTime=2014-08-21T20:58:13.4998725Z
System.Net Information: 0 : [2688] SecureChannel#48611003 - Remote certificate was verified as invalid by the user.
ProcessId=8676
DateTime=2014-08-21T20:58:13.4998725Z
System.Net.Sockets Verbose: 0 : [2688] Socket#31879635::Dispose()
ProcessId=8676
DateTime=2014-08-21T20:58:13.4998725Z
System.Net Error: 0 : [2688] Exception in HttpWebRequest#10189992:: - The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel..
ProcessId=8676
DateTime=2014-08-21T20:58:13.4998725Z
- 更新1 -
好的解决了。我忘了我们输入代码将所有主机名转换为导致名称不匹配的IP地址。这个URL https://connect.microsoft.com/VisualStudio/feedback/details/872612/net-web-service-call-stuck-in-infinite-loop-due-to-exception-in-system-net-sockets描述了为什么我们这样做是因为.NET中的错误,当windows设置为IPv6时,我们就开始使用。
我已将此主机名删除为IP地址转换,但现在它根本无法连接并且正在获取System.Net.Sockets错误:0:[5788]套接字#31879635中的例外情况:: EndConnect - 尝试对无法访问的网络173.78.224.118:4443执行套接字操作。即使连接尝试使用主机名到url,我们也可以使用浏览器从机器浏览到该ip和主机名url。
- 更新2 -
现在已确定在Windows 7上正常工作,但无法使用Windows 8.1获取套接字操作错误。有趣的是Windows 7是在Windows 8.1机器上运行的VM。
答案 0 :(得分:2)
做这样的事情......
ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) =>
{
//evaluate cert and return true if its ok
return true;
});
在打开服务客户端之前,将该代码块放在应用程序的某个位置。