在 .NET 中通过 SSL 消费 Web 服务的常见问题






3.15/5 (8投票s)
在 .NET 中消费启用 SSL 的 Web 服务的常见问题和解决方案
引言
安全性是 Web 服务的一般关注点,因为 SOAP(请求和响应)消息以纯文本格式交换(在 Web 服务和客户端之间)。尽管使用 WSE 2.0/3.0 和 WCF 可以在消息中加密敏感信息,但使用 SSL (HTTPS) 通信是普遍接受的做法。
本文讨论了 .NET 应用程序消费 SSL 启用(自签名/测试证书)服务时通常会出现的问题。
背景
要在您的 Web 服务上实现 SSL,您需要在您的 Web 服务器 (IIS) 上获取并安装由证书颁发机构 (CA) 颁发的证书。通常,此证书仅用于生产环境。在开发和测试环境中,使用自签名证书(测试证书)。您可以使用 MakeCert.exe 工具(包含在 .NET Framework SDK 中)或使用 (IIS) 6.0 资源工具包工具来生成测试证书。
问题 #1
当您尝试从 C# 代码访问启用 SSL 的 Web 服务时,您将收到以下错误....
"The underlying connection was closed: Could not establish trust relationship
with remote server."
如果证书是由主机名和颁发证书的名称不匹配的 CA 颁发的测试(自签名)证书,或者您可能通过外部 IP 地址访问它,则也是如此。
问题 #1 的根本原因
当您浏览 HTTPS 网页或 Web 服务时,您见过以下浏览器窗口多少次?
所有这三个浏览器(Internet Explorer 8、Firefox 3.0.11 和 Chrome)都要求用户在关闭窗口或添加例外之间进行选择,因为它们无法验证此证书是否由有效的 CA 颁发。
问题 #1 的解决方案
当您通过 C# 代码访问 Web 服务时,您应该执行与在浏览器中所做的操作相同的操作 - 信任证书!!。但是,当您以编程方式访问它时,没有消息窗口供您接受它。因此,您只需要模拟消息窗口并要求其信任证书。
这里是模拟消息窗口的代码。
在调用 Web 服务方法之前添加以下代码
ServicePointManager.ServerCertificateValidationCallback
= delegate(Object obj, X509Certificate certificate, X509Chain
chain, SslPolicyErrors errors)
return (true); };
问题 #2
有时,即使在实施解决方案 #1 之后,您也可能会收到以下错误
Server was unable to process request. ---> Unable to generate a temporary
class (result=1).
error CS2001: Source file 'C:\WINDOWS\TEMP\zezde3bz.0.cs' could not be found
error CS2008: No inputs specified
问题 #2 的根本原因
两个不同的设置可能导致此问题
- 系统中的 ASPNET 和 IUSR 用户没有对 'C:\WINDOWS\TEMP\ 的读/写访问权限。
- 您的工作站位于不同的网络域中,并且其 WORKGROUP 也不同。相信我! 在我们工作于多个域(客户端和我们的雇主)的公司环境中,您很可能使用雇主域登录凭据登录到系统,而您的 IP 地址位于您的客户端域中。
问题 #2 的解决方案
毋庸置疑,解决方案很简单
- 权限问题可能由不正确的 .NET Framework 安装引起。您可以重新安装框架,或者您只需将权限添加到 'C:\WINDOWS\TEMP\. 上的 ASPNET 和 IUSR 用户即可。
- 在第二种情况下,对我有用的方法是您应该使用本地登录,并且您的工作站不在任何工作组中,或者您的工作站与它的网络域在同一个工作组中。
历史
- 2009 年 7 月 11 日:初始帖子