第 4 章 –安全通信

更新日期: 2004年04月20日
本页内容
本章内容本章内容
目标目标
适用范围适用范围
如何使用本章内容如何使用本章内容
开始之前开始之前
了解要保护什么了解要保护什么
SSL/TLSSSL/TLS
IPSecIPSec
RPC 加密RPC 加密
点对点安全性点对点安全性
在 IPSec 和 SSL 之间进行选择在 IPSec 和 SSL 之间进行选择
建立场和负载平衡建立场和负载平衡
摘要摘要

本章内容

分布式应用程序定期处理机密信息。此信息可以包括对用户进行身份验证时所使用的凭据,也可以包括个人机密信息,如医疗病史或工作经历。无论此信息是存储在数据库中,还是正通过网络在分布式应用程序的不同组件之间传递,时刻保证此信息的安全都非常重要。

复杂的安全体系结构中一个很重要的因素就是在分布式 Web 应用程序的各组件之间进行安全通信,而且当应用程序使用公共网络(如 Internet)来传递机密信息时,这一点尤其重要。

本章讨论了对安全通信的需要,并描述了现有可用于 ASP.NET Web 应用程序的安全通信技术。

返回页首返回页首

目标

本章的目标是:

了解保障分布式 .NET Web 应用程序各层之间的网络通信安全的原因和方法。

了解以下三项用于实现安全通信的重要技术(SSL/TLS、IPSec 和 RPC 加密)的目的、功能和局限性。

确定 SSL/TLS、IPSec 和 RPC 加密这三项技术中哪一项技术最适合保护您的分布式 Web 应用程序中不同元素之间的通信安全。

返回页首返回页首

适用范围

本章适用于以下产品和技术:

Windows XP 或 Windows 2000 Server (Service Pack 3) 以及更高版本的操作系统

Microsoft Internet 信息服务 (IIS) 5.0 以及更高版本

SQL Server 2000 (Service Pack 2) 以及更高版本

返回页首返回页首

如何使用本章内容

若要学好本章内容:

阅读第 1 章简介。本章详细说明了安全通信对于分布式 Web 应用程序的重要性。

阅读第 2 章 ASP.NET 应用程序的安全模型。本章概述了创建分布式 ASP.NET Web 应用程序时所采用的体系结构和技术,并重点说明了该体系结构中哪些地方需要保证通信安全。

阅读以下各章,它们演示了本章所讨论的各项安全通信技术:

如何使用 SSL 调用 Web 服务

如何在 Web 服务器上设置 SSL

如何使用 IPSec 在两个服务器之间进行安全通信

如何使用 SSL 来确保与 SQL Server 2000 安全通信

返回页首返回页首

开始之前

许多应用程序通过网络与最终用户之间传递机密数据,此外还在中间应用程序节点之间传递机密数据。机密数据可包括用于身份验证的凭据,或者信用卡号码或银行交易明细等数据。为了防止发生意外的信息泄露,并保护数据以免在传输时遭擅自修改,就必须确保通信端点间的通道安全。

安全通信具有以下两个特点:

保密性。保密性是指确保数据处于私有和保密状态,并且不会被可能使用网络监控软件的窃听者查看到。通常借助加密来达到保密目的。

完整性。安全的通信通道还必须能确保数据受到保护,以防止数据在传输过程中遭到意外或蓄意(恶意)的修改。完整性通常是通过使用“消息身份验证代码”(Message Authentication Code, MAC) 实现的。

本章介绍了以下安全通信技术:

安全套接字层/传输层安全 (SSL/TLS)。它通常用于确保浏览器与 Web 服务器之间的通道安全。不过,还可以用于保护从运行 Microsoft® SQL Server™ 2000 的数据库服务器进出的 Web 服务消息和通信的安全。

Internet 协议安全性 (IPSec)。IPSec 提供了传输层安全通信解决方案,可以用于保护在两台计算机(例如应用程序服务器和数据库服务器)之间传送的数据的安全。

远程过程调用 (RPC) 加密。分布式 COM (Distributed COM, DCOM) 使用的 RPC 协议提供了一个身份验证级别(数据包保密性),它对客户端和服务器之间传送的每个数据包都进行加密。

返回页首返回页首

了解要保护什么

一个 Web 请求在应用程序的物理部署层间传输时,要经过许多通信通道。图 4.1 显示了一个常用的 Web 应用程序部署模型。

典型的 Web 部署模型

图 4.1
典型的 Web 部署模型

在这个典型的部署模型中,一个请求要通过三个不同的通道。客户端到 Web 服务器的链接可能通过 Internet 或公司 Intranet 实现,并且通常使用 HTTP。其余两个链接则是在公司域的内部服务器之间实现。虽然如此,以上三种链接的安全都令人担心。许多完全基于 Intranet 的应用程序在各层之间传输机密数据;例如,处理雇员机密数据的人力资源和工资单应用程序。

图 4.2 显示了如何结合使用 SSL、IPSec 和 RPC 加密来保护每一个通道的安全。

能够安全通信的典型 Web 部署模型

图 4.2
能够安全通信的典型 Web 部署模型

选择技术时必须考虑许多因素,包括传输协议、端点技术和环境方面的注意事项(例如硬件、操作系统版本、防火墙等等)。

返回页首返回页首

SSL/TLS

SSL/TLS 用于在客户端和服务器之间建立加密通信通道。用于建立安全通道的握手机制有详细记录,详细信息可以在 Microsoft 知识库中的以下文章中找到:

Q257591 Description of the Secure Sockets Layer (SSL) Handshake(安全套接字层 (SSL) 握手说明)

Q257587 Description of the Server Authentication Process During the SSL Handshake(SSL 握手期间的服务器身份验证过程说明)

Q257586 Description of the Client Authentication Process During the SSL Handshake(SSL 握手期间的客户端身份验证过程说明)

使用 SSL

使用 SSL 时,您应该注意以下几点:

应用 SSL 时,客户端使用 HTTPS 协议(并指定 https:// URL),而且服务器在 TCP 端口 443 上侦听。

启用 SSL 时,您应该监控应用程序的性能。
SSL 使用复杂的加密功能对数据进行加密和解密,因此对应用程序的性能有所影响。初始握手时使用非对称的公钥/私钥加密,此时对性能的影响最大。此后(生成并交换了安全会话密钥后),将使用速度更快的对称加密来对应用程序数据进行加密。

您应该在使用 SSL 的页面中使用较少的文字和简单的图形,从而对页面进行优化。

由于在建立会话期间,SSL 对性能的影响最大,因此请确保连接不超时。
您可以通过增大 ServerCacheTime 注册表项的值来做相应调整。有关详细信息,请参见 Microsoft 知识库文章 Q247658 HOW TO: Configure Secure Sockets Layer Server and Client Cache Elements(如何:配置安全套接字层服务器和客户端缓存元素)。

SSL 要求将服务器身份验证证书安装在 Web 服务器上(如果您要使用 SSL 与SQL Server 2000 通信,则安装在数据库服务器上)。有关安装服务器身份验证证书的详细信息,请参见本指南中的如何在 Web 服务器上设置 SSL。

返回页首返回页首

IPSec

IPSec 可以用于保护在两台计算机(例如应用程序服务器和数据库服务器)之间传送的数据的安全。IPSec 对应用程序来说是完全透明的,因为加密、完整性和身份验证等服务是在传输层实现的。应用程序可以继续使用 TCP 端口和 UDP 端口以正常方式相互通信。

使用 IPSec,您可以:

对两台计算机之间传送的所有数据加密,从而实现消息机密性。

在两台计算机之间提供消息完整性(但不加密数据)。

在两台计算机(而非用户)之间相互验证身份。例如,您可以建立只允许特定客户端计算机(例如应用程序服务器或 Web 服务器)所发请求的策略,从而帮助保护数据库服务器的安全。

限制哪些计算机能够相互通信。您也可以限制只与特定的 IP 协议和 TCP/UDP 端口通信。

注意:IPSec 的目的不是取代应用程序级安全。现在,它用作一种深层防御机制,或用于在不更改应用程序的情况下保护不安全的应用程序,以及保护非 TLS 协议免受网络线路攻击。

使用 IPSec

使用 IPSec 时,您应该知道:

IPSec 既可以用于身份验证,又可以用于加密。

没有供开发人员以程序设计方式控制设置的 IPSec API。IPSec 完全是通过本地安全策略 Microsoft 管理控制台 (MMC) 内的 IPSec 管理单元进行控制和配置的。

Microsoft Windows® 2000 操作系统中的 IPSec 并不能保护所有 IP 通信类型的安全。
具体来说,它不能用于保护广播通信、多路广播通信、Internet 密钥交换通信或 Kerberos(已经是一个安全协议)通信的安全。

有关详细信息,请参见 Microsoft 知识库文章 Q253169 Traffic That Can--and Cannot--Be Secured by IPSec(IPSec 能够保护和不能保护的通信)。

您可以使用 IPSec 筛选器控制何时应用 IPSec。
若要测试 IPSec 策略,请使用 IPSec 监视器。IPSec 监视器 (Ipsecmon.exe) 提供有关哪个 IPSec 策略是活动的以及计算机之间的安全通道是否已经建立的信息。

有关详细信息,请参见下列 Microsoft 知识库文章:

Q313195 HOW TO: Use IPSec Monitor in Windows 2000(HOW TO:在 Windows 2000 中使用 IPSec 监视器)

Q231587 Using the IP Security Monitor Tool to View IPSec Communications(使用 IP 安全监视器工具查看 IPSec 通信)

若要在两个服务器之间建立信任关系,可以使用具有相互身份验证的 IPSec。这种方法使用证书来验证两台计算机的身份。

有关详细信息,请参见下列 Microsoft 知识库文章:

Q248711 Mutual Authentication Methods Supported for L2TP/IPSec(L2TP/IPSec 支持的相互身份验证方法)

Q253498 HOW TO: Install a Certificate for Use with IP Security(HOW TO:安装用于 IP 安全的证书)

如果您需要使用 IPSec 来保护两台被防火墙隔开的计算机间的通信安全,请确保防火墙没有使用网络地址转换 (Network Address Translation, NAT)。IPSec 不能在任何基于 NAT 的设备上运行。

有关详细信息和配置步骤,请参见 Microsoft 知识库文章 Q233256 HOW TO Enable IPSec Traffic through a Firewall(如何使 IPSec 通讯能够通过防火墙)和本指南中的如何使用 IPSec 在两个服务器之间进行安全通信。

返回页首返回页首

RPC 加密

RPC 是 DCOM 使用的基本传输机制。RPC 提供一套可配置的身份验证级别,范围从无身份验证(和无数据保护)到参数状态的完全加密。

最安全的级别(RPC 数据包保密性)会为每一个远程过程调用(以及由此产生的每一个 DCOM 方法调用)的参数状态加密。RPC 加密的级别(40 位或 128 位)取决于客户端计算机和服务器计算机上运行的 Windows 操作系统版本。

使用 RPC 加密

当基于 Web 的应用程序与远程计算机上的服务组件(在企业服务服务器应用程序内)通信时,您最有可能会希望使用 RPC 加密。

在这种情况下,若要使用 RPC 数据包保密性身份验证(和加密),您必须对客户端和服务器都进行配置。在客户端和服务器之间会发生高水印协商过程,这可以确保使用两个(客户端和服务器)设置中较高的那个设置。

通过在服务组件程序集中使用 .NET 属性,或者通过在部署时使用“组件服务”管理工具,您可以在(企业服务)应用层上定义服务器设置。

如果客户端是 ASP.NET Web 应用程序或 Web 服务,将使用 Machine.config 中 <processModel> 元素的 comAuthenticationLevel 属性来配置客户端所使用的身份验证级别。这会为 Web 服务器上运行的所有 ASP.NET 应用程序提供默认的身份验证级别。

更多信息

有关 RPC 身份验证级别协商和服务组件配置的详细信息,请参见第 9 章企业服务安全性。

返回页首返回页首

点对点安全性

点对点通信情况大致可以分为以下几种:

浏览器到 Web 服务器

Web 服务器到远程应用程序服务器

应用程序服务器到数据库服务器

浏览器到 Web 服务器

若要保护在浏览器和 Web 服务器之间传送的机密数据的安全,请使用 SSL。在下列情况下,您需要使用 SSL:

您使用的是“窗体”身份验证,并且需要保护从登录窗体提交给 Web 服务器的明文凭据的安全。
在这种情况下,您应该使用 SSL 保护所有页面(而不仅仅是登录页面)的访问安全,以确保初始身份验证过程中生成的身份验证 Cookie 在客户端浏览器与应用程序的会话期间保持安全状态。

您使用的是“基本”身份验证,并且需要保护(Base64 编码的)明文凭据的安全。
此时,您应该使用 SSL 确保所有页面(而不仅仅是初始登录页)的访问安全,因为“基本”身份验证会随对应用程序的所有请求(不仅仅是初始请求)将明文凭据传送到 Web 服务器。

注意:Base64 用于将二进制数据编码为可打印的 ASCII 文本。与加密不同的是,它不提供消息的完整性和保密性。

您的应用程序在浏览器和 Web 服务器之间传递机密数据(例如,信用卡号码或银行帐户明细)。

Web 服务器到远程应用程序服务器

应该使用 IPSec、SSL 或 RPC 加密来确保 Web 服务器和远程应用程序服务器之间的传输通道安全。至于选用哪一种,将取决于传输协议和环境因素(操作系统版本、防火墙等等)。

企业服务。如果您的远程服务器中承载了一个或多个服务组件(在企业服务服务器应用程序中),并且您直接与这些服务组件通信(使用 DCOM),则请使用“RPC 数据包保密性”加密。

有关如何在 Web 应用程序和远程服务组件之间配置 RPC 加密的详细信息,请参见第 9 章企业服务安全性。

Web 服务。如果您的远程服务器上承载了 Web 服务,则可以选择 IPSec 或 SSL。
由于 Web 服务已使用 HTTP 传输,因此通常您应使用 SSL。SSL 还使您可以只对从 Web 服务传入和传出的数据(而不是在这两台计算机之间的所有通信)进行加密。IPSec 则会使在两台计算机之间的所有通信都进行加密。

注意:消息级别安全(包括数据加密)由全球 XML Web 服务体系结构 (Global XML Web Services Architecture, GXA) 提案(具体说就是WS 安全规范)所提出。Microsoft 提供了 Web 服务开发工具包,能让您开发消息级别安全解决方案。该工具包可从 http://msdn.microsoft.com/webservices/building/wsdk/ 下载获得。

.NET 组件(使用 .NET Remoting)。如果您的远程服务器承载了一个或多个 .NET 组件,并且您通过 TCP 通道与这些组件连接,则可以使用 IPSec 来提供安全的通信链路。如果将 .NET 组件驻留在 ASP.NET 内,则可以使用 SSL(以 IIS 配置)。

应用程序服务器到数据库服务器

若要保护在应用程序服务器和数据库服务器之间传送的数据安全,可以使用 IPSec。如果您的数据库服务器运行 SQL Server 2000(并且 SQL Server 2000 网络库安装在应用程序服务器上),您可以使用 SSL。后者需要在数据库服务器的计算机存储区中安装服务器身份验证证书。

在下列情况中,您可能需要保护数据库服务器链接的安全:

您连接到数据库服务器,并且没有使用 Windows 身份验证。例如,您可能对 SQL Server 使用的是 SQL 身份验证,或者您可能连接到一个非 SQL Server 数据库。在上述情况下,将以明文方式传递凭据,因此可能存在严重的安全问题。

注意:对 SQL Server 使用 Windows 身份验证的一个主要优点是:这意味着不会在网络中传递凭据。有关 Windows 身份验证和 SQL 身份验证的详细信息,请参见第 12 章数据访问安全性。

您的应用程序可能会将机密数据提交到数据库并从数据库中检索机密数据(例如,工资单数据)。

对 SQL Server 使用 SSL

如果您使用 SSL 保护 SQL Server 数据库通道安全,请考虑以下几点:

若要使 SSL 生效,您必须在数据库服务器计算机上的计算机存储区中安装服务器身份验证证书。客户端计算机上也必须具有由颁发服务器证书的同一(或信任的)证书颁发机构颁发的根“证书颁发机构”证书。

客户端必须已经安装了 SQL Server 2000 连接库。早期版本或通用库会无法运行。

SSL 只适用于 TCP/IP(为 SQL Server 推荐采用的通信协议)和命名管道。

您可以将服务器配置为对所有(来自所有客户端的)连接都强制使用加密。

您可以在客户端上执行以下操作:

强制对所有传出连接进行加密。

通过使用连接字符串,允许客户端应用程序选择是否按连接进行加密。

当客户端或服务器 IP 地址发生更改时,并不需要更改配置。这一点与 IPSec 不同。

更多信息

有关对 SQL Server 使用 SSL 的详细信息,请参见以下资源:

本指南中的如何使用 SSL 来确保与 SQL Server 2000 安全通信。

网络广播:Microsoft SQL Server 2000: How to Configure SSL Encryption (April 23, 2002)(Microsoft SQL Server 2000:如何配置 SSL 加密(2002 年 4 月 23 日))

返回页首返回页首

在 IPSec 和 SSL 之间进行选择

在 IPSec 和 SSL 之间进行选择时,请考虑以下几点:

IPSec 可以用于保护计算机间的所有 IP 通信安全;而 SSL 则特定于个别的应用程序。

IPSec 是计算机范围的设置,因此不支持特定网络连接的加密。但是,网站可以划分为使用或不使用 SSL。此外,当您使用 SSL 连接到 SQL Server 时,可以按连接(从客户端应用程序)来选择是否使用 SSL。

IPSec 对于应用程序是透明的,因此它可以与在 IP 之上运行的安全协议结合使用,例如 HTTP、FTP 和 SMTP。而 SSL/TLS 却与应用程序紧密地联系在一起。

除了加密之外,IPSec 还可以用于计算机的身份验证。这对于受信任的子系统方案尤其重要,在这种方案中,数据库授权来自特定应用程序(在特定的计算机上运行)的固定身份。IPSec 可用于确保只有特定的应用程序服务器能够连接到数据库服务器,以防止来自其他计算机的攻击。

IPSec 要求两台计算机都运行 Windows 2000 或更高版本。

SSL 可以穿过基于 NAT 的防火墙工作,而 IPSec 则不能。

返回页首返回页首

建立场和负载平衡

如果您在多个虚拟 Web 站点中使用 SSL,您需要使用唯一的 IP 地址或唯一的端口号。不能让多个站点使用相同的 IP 地址和端口号。如果将 IP 地址与负载平衡器中的服务器相似性设置结合使用,则效果更好。

更多信息

有关详细信息,请参见 Microsoft 知识库中的 Q187504 HTTP 1.1 Host Headers Are Not Supported When You Use SSL(使用 SSL 时不支持 HTTP 1.1 主机标题)。

返回页首返回页首

摘要

本章描述了您可如何结合使用 SSL、IPSec 和 RPC 加密,以便为您的分布式应用程序提供端到端安全通信解决方案。概括起来,有以下几点:

对于通过 Internet 和公司 Intranet 传递的数据来说,通道安全是个值得关心的问题。

考虑 Web 浏览器到 Web 服务器、Web 服务器到应用程序服务器以及应用程序服务器到数据库服务器等链接的安全要求。

安全通信提供保密性和完整性。它无法防止不可否认性(这需要客户端证书)。

通道安全选项包括 SSL、IPSec 和 RPC 加密。当您的应用程序使用 DCOM 与远程服务组件通信时,适合使用最后一个选项。

如果您使用 SSL 与 SQL Server 通信,应用程序可以选择(基于每个连接)是否对连接加密。

IPSec 会对两台计算机之间的所有 IP 通信都进行加密。

安全机制的选择取决于传输协议、操作系统版本和网络注意事项(包括防火墙)。

在安全通信与性能之间始终存在一种此消彼长的关系。请选择适合您的应用程序要求的安全级别。


返回页首返回页首