【编程开发】AspAsp.NetCGIPHPJspXMLPERLC++C#VCVBDelphiPowerBuilderJAVA汇编数据库编程移动开发其它语言

您现在的位置:首页 > 网络学院 > 编程开发 > XML > 建立安全 Web 服务

建立安全 Web 服务

来源: 作者: 日期:2006-08-11

【聚杰网XML】建立安全 Web 服务



  执行 SSL 连接

  尝试打开到 Web 服务器的 SSL 连接。若要实现此目的,让我们首先设置 Calc/Service/Rpc/AspVbsVb SOAP Toolkit 示例。需要执行以下操作:

  在服务器上,执行 SOAP Toolkit 2.0 示例描述文件 C:/Program Files/MSSOAP/Samples/default.html 中有关示例设置的所有指导。

  在服务器上,编辑 C:/ProgramFiles/MSSOAP/Samples/Calc/Service/Rpc/AspVbsVb/calc.wsdl 文件,并在位置 URL 而不是在 MSSOAP 的以下位置指定 Web 服务器名称:




  在客户端上运行以下 VBScript:




  这样,即建立了一个 SSL 连接。请注意,如果将 URL 改回 HTTP,将建立一个通常意义上的非安全 HTTP 连接。若要使您的服务器要求 Web 服务实现 SSL 连接,需要在服务所在的虚拟目录上设置“要求 SSL”。请执行以下操作:

  在 IIS 4.0 上

  用鼠标右键单击 IIS 管理器中的虚拟目录,并选择“属性”。

  在“目录安全性”选项卡上,单击“编辑安全通信”。

  启用“访问本资源时要求安全通道”。

  在 IIS 5.0 上

  用鼠标右键单击 IIS 管理器中的虚拟目录,并选择“属性”。

  在“目录安全性”选项卡上,单击“编辑安全通信”。

  启用“要求 SSL”。

  现在,如果试图建立与该服务的非安全 HTTP 连接,将会出错。

  SSL 中的服务器身份验证

  常见错误是在 SSL 连接中使用 localhost 或服务器主机名的其它别名。在 SSL 握手期间,客户端验证服务器证书主题名称的公用名称 (CN) 部分与 HTTP 请求中的主机名是否匹配。如果不匹配,SSL 连接将失败。客户端还同时验证服务器端证书是否有效、是否撤消以及是否由信任的 CA 颁发。

  客户端证书身份验证

  除了必要的服务器身份验证,SSL 还有一个可选步骤:对客户端进行身份验证。这是使用客户端证书进行的。客户端证书与服务器证书相似。如果服务器配置为要求客户端证书,客户端会将客户端证书发送到服务器。服务器至少要检查它是否信任此客户端证书,例如,它是否由信任的证书颁发机构颁发。

  在服务器上配置客户端证书身份验证

  IIS 4.0 和 IIS 5.0 都可以配置为:

  忽略客户端证书。这种情况下,客户端证书身份验证将关闭。

  接受但不要求客户端证书。这种情况下,如果提供了客户端证书,将对客户端进行身份验证。这时,所谓的身份验证仅是检查客户端证书是否有效、可信。

  要求客户端证书。如果没有提供客户端证书,连接将被拒绝。将如前一选项那样对提供的客户端证书进行检查。

  要求客户端证书,并将其映射到指定的用户帐户。这种身份验证方式与要求客户端证书相同,但 IIS 工作线程还模拟指定用户的凭据。

  使用由 CA 而不是默认信任的颁发机构(例如 Verisign 或 Thawte)颁发的客户端证书时,需要确保该 CA 根目录证书存储在服务器上的 LOCAL_MACHINE/Root/ 存储区中,而不是存储在 CURRENT_USER/Root/ 存储区中。默认情况下,向导将 CA 的证书放置在 CURRENT_USER/Root/ 中,这使该证书对 IIS 不可见,因为它使用不同的用户帐户。

  如何配置 IIS 使用上述客户端证书选项之一?请按照上述步骤执行,但第三步要执行以下操作(IIS 4.0 和 IIS 5.0 中的对话框相似):

  若要忽略客户端证书,请在 IIS 5.0 上选择“忽略客户端证书”或在 IIS 4.0 上选择“不接受客户端证书”;

  若要接受但不要求客户端证书,请选择“接受客户端证书”;

  若要要求客户端证书,请选择“要求客户端证书”;

  若要要求客户端证书与指定的用户帐户匹配,请选择“要求客户端证书”以及“启用客户端证书映射”。此时,您需要具有一个文件,该文件包含要映射的导出客户端证书。要获得该文件,请在客户端证书所在的客户端计算机上,执行以下操作:

  在 Internet Explorer 中,单击“工具”菜单上的“Internet 选项”。单击“内容”选项卡,然后单击“证书”。

  在出现的对话框上,将具有 CURRENT_USER/MY、CURRENT_USER/Root 等证书存储区。(请注意不会显示 LOCAL_MACHINE/ 中的任何存储区。)

  选择要导出的证书,并单击“导出”。在向导中,选择“不,不要导出私有密钥”和“Base64 编码 X.509(.CER)”格式。选择文件名。结果文件将包含导出的客户端证书。

  若要将文件添加到服务器,请在“编辑客户端证书映射”对话框中,单击“添加”并选择包含客户端证书的文件。

  将要求您提供映射名称。选择任意帐户名称以映射到证书和密码。每当连接到此虚拟目录中的服务时,客户端都发出此证书,将使用所选帐户模拟请求处理线程。有关使用客户端证书进行身份验证的详细信息,请参阅 Windows 2000 网站上将证书映射到用户帐户的逐步指导(英文)。

  在客户端使用 SSL 客户端证书

  本节介绍为了与服务交流而需要提供客户端证书时,如何在客户端上进行操作。如何获取和安装客户端证书?可以从 Verisign 或任何其它 CA 获取客户端证书(Web 标识)。

  注意:服务器证书和客户端证书的用途不同。不能将服务器端证书用作客户端证书。

  获得包含证书的文件(.cer 文件)之后,双击该文件即可进行安装。按照前述安装 Verisign 测试 CA 根目录证书的步骤进行操作。将要求您指定存放证书的存储区。客户端证书的默认(推荐)存储区是 CURRENT_USER/MY/。

  注意:准备客户端证书的请求时,通常会询问您是否使用 CURRENT_USER 或 LOCAL_MACHINE 存储区来存储证书。

  如果希望只能从创建请求时所使用的帐户访问证书,则使用 CURRENT_USER 存储区。

  如果希望几个特权用户可以共享访问此证书,则使用 LOCAL_MACHINE 存储区。只有本地管理帐户具有 LOCAL_MACHINE 存储区的访问权限。例如,如果在具有客户端证书身份验证的 SSL 之上使用 SOAP 进行远程配置,并且希望从任何本地管理员帐户都可以使用客户端脚本,可能要使用该存储区。

  以下是一些创建客户端证书请求并将证书安装到所选存储区的简单脚本。脚本使用证书注册控制,与上述用于服务器证书的脚本很相似:




  ClientCertReq.txt 文件将包含一个 Base64 编码的 PKCS10 请求。若要在从 CA 接收到 SSL 客户端证书后进行安装,请使用下列脚本:




  该脚本将从指定文件获取证书,并将其安装到 IIS 保存服务器证书的 LOCAL_MACHINE 存储区。可以使用这些脚本自动进行配置。

  如何使 SoapClient 使用客户端证书?这相当容易。您需要了解证书保存在哪个存储区以及证书公用名称(主题名称的 CN 部分)。当从 IE5 或 Microsoft Management Console(mmc.exe)浏览时,公用名称显示在“颁发给”列。以下脚本:





  从 CURRENT_USER/MY 存储区提取 CN=MyCert 的证书,并使用此证书请求安全服务。也可以显式指定要使用的存储区:




  证书名称不区分大小写,但存储区名称区分大小写。

  “服务器至服务器”方案中的客户端证书

  我们详细介绍并提供了一个使用客户端证书的安全 B2B 解决方案示例。为了防止攻击,在“服务器至服务器”方案中正确使用客户端证书至关重要。

  方案:Internet 商店使用第三方付费的 Web 服务验证提交的客户信息(例如信用卡号)。付费的 Web 服务要求客户端证书身份验证。

  Internet 商店应用程序要求下列组件:

  Web 应用程序:在高保护(隔离)Web 应用程序中运行的一组 ASP 页(这是很重要的)。当需要使用信用卡号验证服务时,调用执行该任务的 COM+ 应用程序。这些 ASP 页不访问客户端证书,也不直接使用 SoapClient。该应用程序允许匿名访问。

  COM+ 应用程序:配置为以特定本地帐户标识在独立进程中运行。用于对第三方信用卡号验证服务进行身份验证的客户端证书保存在该本地帐户的个人 (CURRENT_USER/MY/) 存储区。该 COM+ 对象是信用卡号验证服务的代理,而且使用 SoapClient 访问该服务,并如上所述使用客户端证书进行身份验证。


  信用卡号验证服务:要求 SSL 连接和客户端证书身份验证。

  客户端证书存储在证书存储区中,并且该证书存储区不能从 ASP 页能够模拟的任何帐户访问。这样,就确保了攻击者无法通过执行脚本代码使用客户端证书,即使他们获得了对 ASP 页的更新访问权限。不要从 ASP 页直接访问客户端证书。

  SSL 和客户端证书支持的已知局限性

  Windows 98:Windows 98 上的某些 WinInet 版本不支持客户端证书。

  Windows 98、Windows Me 和 Windows XP:如果包含服务的虚拟目录(在 IIS 4.0 或 IIS 5.0 上)配置为要求客户端证书,则无法连接到要求客户端证书的本主机上的任何其它 URL。这是由于 WinInet 中的证书缓存问题所致,而且在整个进程生存期内都存在。但是,您可以连接到另一台主机上的安全 URL。

  在 Windows ME 中,SSL 连接可能在关闭时挂起。有关详细信息,请参阅知识库文章 Q238934。有关此 Windows ME 问题的 QFE,请与 Microsoft 产品支持服务联系。

  Windows 2000 和 Windows NT4 上的 SoapClient 只能通过端口 443 进行 SSL 连接。

  身份验证问题

  这里,我们将讨论使用 SOAP Toolkit 2.0 提供 COM 对象时可能遇到的某些身份验证问题。这些并非安全漏洞,但您可能希望在部署安全 Web 服务时避免这些问题并确保资源的可用性。

  以匿名登录方式访问文件和其它资源

  当对允许匿名登录的 Web 服务发出 SOAP 请求时,IIS 将使用特殊 IUSR_machinename 帐户模拟请求处理服务器线程。如果已作为 Web 服务公开的 COM 对象试图使用禁止 IUSR_machinename 帐户访问的资源,将收到“拒绝访问”错误。为了避免此错误,可以更改 IUSR_machinename 对该资源的权限,或者更改虚拟目录设置以使用另一匿名访问帐户。(请参阅身份验证部分)

  “服务器至服务器”方案

  “服务器至服务器”是非常普遍的方案,其中 SoapClient 对象是从 ASP 文件内部使用。为了提高性能,需要缓存 global.asa 文件内的 SoapClient 对象。这样,可以避免重新调用 SoapClient.mssoapinit 和分析 WSDL 文件。在该解决方案中,如果正在访问另一台要求身份验证的安全服务器,需要在 global.asa 文件中设置凭据。

  不能执行 NTLM 身份验证,因为它具有委派局限性(请参阅身份验证部分)。

  注意:对于 Kerberos,请务必显式指定要使用哪些凭据。不要依赖当前线程凭据,因为具有较强凭据的客户端发出第一个请求后,所有后续调用都将继续使用此连接。这可能会在您的解决方案中导致安全漏洞
注意:为了使解决方案更安全,我们推荐您采用使用 SoapClient 的独立 COM+ 应用程序代码并执行经过身份验证的连接。请参阅有关使用上述客户端证书身份验证的“服务器至服务器”解决方案的详细描述。这样 ,可以避免用户名和密码受到已经获得 ASP 页源代码访问权限的攻击者的攻击。

  注意:如果决定在 ASP 页中使用 SoapClient,推荐在高保护(隔离)模式下运行 ASP 页。出于优化目的,执行 HTTP 连接的 SoapClient 代码以进程帐户而不是调用线程的帐户运行。这意味着,如果在低保护(进程内)模式下运行的 ASP 页中使用 SoapClient,HTTP 代码将在系统帐户下运行。如果使用隔离模式,它将在较安全的 IWAM_machinename 帐户下运行。

  在 NT4 上的 MTS 中运行的对象:

  如果提供的 COM 对象是在 NT 4.0 上的 MTS Server Package 中运行,则可能会导致一些安全问题。在 NT 4.0 中,COM 在进行本地 COM 调用时始终使用进程标识。这意味着,当 SOAP 侦听器创建和调用 COM 对象时,将使用进程标识进行调用,并且将忽略处理线程正在模拟用户凭据的事实。MTS 数据包始终认为传入调用是由同一个用户帐户发出的。用户帐户将是 IWAM 帐户(如果 SOAP 侦听器所在的虚拟目录配置为进程外运行)或 SYSTEM 帐户(如果 SOAP 侦听器所在的虚拟目录配置为进程内运行)。这会导致两种不同结果:

  由于忽略被模拟的用户并使用进程标识进行调用,这种情况下,MTS 角色安全性不是非常有效。

  无法将被模拟用户与 MTS COM 对象区分开来。例如,调用 GetDirectCallerName 时不会返回被模拟用户,而是返回 IWAM 或 SYSTEM。

  有关详细信息,请参阅知识库文章 #Q243437“PRB:默认情况下 MTS 和 COM+ 库数据包中的标识是不同的”。

  疑难解答

  本节将介绍使用 Microsoft SOAP Toolkit 2.0 设计安全 Web 应用程序时遇到的典型问题,以及如何根据上一节提供的信息解决这些问题。

  拒绝访问

  通过 SOAP 调用公开的服务器端对象时,可能出现“拒绝访问”错误,而本地且不通过 SOAP 调用对象时不会出现此错误。您很可能正在以匿名帐户运行服务,并访问了无法从 IIS 匿名帐户访问的资源(文件系统或其它内容)。需要更改对此资源的访问权限,或者禁止匿名登录此 Web 服务。有关详细信息,请参阅身份验证部分。

  基本身份验证不能正常工作

  确保将运行服务的虚拟目录配置为要求基本身份验证,并在基本身份验证设置中指定了域名(默认使用“/”)。请参阅基本身份验证部分。

  摘要式身份验证不能正常工作

  阅读摘要式身份验证部分列出的要求,并确认完全符合这些要求。请认真斟酌是否确实需要使用摘要式身份验证。

  Windows 集成身份验证不能正常工作

  检查客户端和服务器是否位于同一个域。如果不是,请按 Windows 集成身份验证 (NTLM) 部分中的示例所示指定域名和用户名。如果在“服务器至服务器”方案下无法正常工作,请确保两个服务器都运行 Windows 2000。如果正在 Windows NT4.0 上使用 NTLM,则不适用于“服务器至服务器”方案。

  SOAP Toolkit 不能通过代理正常工作

  检查是否设置了 UseProxy 属性以及是否正确指定了代理服务器名称,或者在默认 Internet Explorer 设置中对其进行了设置(如果使用这些属性和名称)。SOAP Toolkit 2.0 代理支持已经通过市场上许多可用代理进行了测试(包括 Microsoft Proxy 2.0、ISA 代理、Apache 代理服务器、Netscape 代理服务器等)。只有用于 Netscape 代理时出现了问题。

  SSL 不能正常工作

  这是最常见的问题。通常是由于服务器未正确配置为支持 SSL 引起的。请参考 SSL 部分中的指导。若要查看服务器是否启用 SSL,请使用 Internet Explorer 访问您的服务 URL。

  另一种可能是客户端不信任服务器端证书。在客户端,确保为颁发服务器端证书的 CA 安装了根目录证书。

  如果正在运行“服务器至服务器”方案,例如尝试在 ASP 页中使用 SoapClient 调用另一台服务器,请确保已将为颁发服务器端证书的 CA 安装的根目录证书安装到了 LOCAL_MACHINE 存储区中。有关详细信息,请参阅 SSL 部分。

  SSL 客户端证书不能正常工作

  确保在 SSLClientCertificateName 连接器属性中正确指定了客户端证书的名称和存储区。应该指定证书主题名称的公用名称 (CN) 部分。若要检查 CURRENT_USER/MY 存储区中证书的 CN 名称,请转至 Internet Explorer/“工具”/“选项”/“内容”/“证书”菜单,并在可用的客户端证书列表中选中“颁发给”。

  确保客户端证书合法,例如,转至 Internet Explorer/“工具”/“选项”/“内容”/“证书”菜单,并单击证书,应不提示任何警告并显示“证书正常”和“您具有证书的私有密钥。”

  确保服务器信任您的客户端证书,例如,颁发客户端证书的 CA 的根目录证书位于服务器上的 LOCAL_MACHINE/Root 存储区中。有关如何检查这些内容的详细信息,请参阅 SSL 客户端证书部分。

  确保运行进程的帐户对指定的证书存储区具有访问权限。请参阅身份验证问题部分中“服务器至服务器”一节的注释。

  有关详细信息

  《设计 Microsoft Windows 2000 基于 Web 的安全应用程序》,Michael Howard、Marc Levy 和 Richard Waymire 编著。

  《运行 Microsoft Internet Information Server》,Leon Braginski 和 Matt Powell 编著。

  知识库文章 #Q243437,PRB:默认情况下 MTS 和 COM+ 库数据包中的标识是不同的(英文)。


1 2

上一页 1 2 3 4 5 下一页

评论   点击查看全部评论
您的评论参与,将为聚杰带来更大的动力!请不要吝啬!
快速回复
请使用文明语言让我们维护健康绿色网络环境!

匿名发表   验证码: