65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.15/5 (8投票s)

2009年7月11日

CPOL

3分钟阅读

viewsIcon

90160

在 .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.10 显示以下消息

Web_Service_Error_in_FireFox

Google Chrome 显示以下消息

所有这三个浏览器(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 的根本原因  

两个不同的设置可能导致此问题

  1. 系统中的 ASPNET 和 IUSR 用户没有对 'C:\WINDOWS\TEMP\ 的读/写访问权限。
  2. 您的工作站位于不同的网络域中,并且其 WORKGROUP 也不同。相信我! 在我们工作于多个域(客户端和我们的雇主)的公司环境中,您很可能使用雇主域登录凭据登录到系统,而您的 IP 地址位于您的客户端域中。

问题 #2 的解决方案

毋庸置疑,解决方案很简单

  1. 权限问题可能由不正确的 .NET Framework 安装引起。您可以重新安装框架,或者您只需将权限添加到 'C:\WINDOWS\TEMP\. 上的 ASPNET 和 IUSR 用户即可。 
  2. 在第二种情况下,对我有用的方法是您应该使用本地登录,并且您的工作站不在任何工作组中,或者您的工作站与它的网络域在同一个工作组中。

历史

  • 2009 年 7 月 11 日:初始帖子
© . All rights reserved.