使用通配符证书通过SSL进行C#Web服务调用(asmx)

时间:2014-08-21 22:22:09

标签: c# asp.net .net web-services ssl

我正在从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。

1 个答案:

答案 0 :(得分:2)

做这样的事情......

ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) =>
{
    //evaluate cert and return true if its ok
    return true;
});

在打开服务客户端之前,将该代码块放在应用程序的某个位置。