级别: 中级 Greg Herringer (gherring@ca.ibm.com), IT 架构师, IBM Zaman Valli-Hasham (zamanv@ca.ibm.com), IT 专家, IBM
2006 年 2 月 13 日 本文为门户管理员和开发人员介绍了一种保护选定门户页面上的个人信息的方法。
引言
当可以通过个性化增强用户体验时,高度可交互和有用的网站会带来最优的价值。大多数用户一致期望向网站提供的任何个人数据都通过安全手段传送。IBM WebSphere Portal 是一个优秀的平台,在这个平台上可以构建内容丰富的网站;然而,有选择地保护特定页面(使用 SSL)却不是件简单的任务。
本文描述在最近的 WebSphere Portal 部署项目中采用的一种方法,它可以保护门户上收集和显示用户个人信息的特定页面。门户管理员和开发人员也许可以在您的 WebSphere Portal 部署中采用这项技术。
本文假设读者熟悉 Websphere Portal、 Websphere Application Server 和 IBM HTTP Server 管理工具,这些是部署下面描述的配置所必需的。
部署的门户体系结构
最近为一家旅游休闲公司完成的项目是基于 WebSphere Portal 构建功能齐全和内容丰富的网站。图 1 阐释了为支持门户实现而部署或集成的组件。
图 1 门户的体系结构概述
该解决方案包括以下 IBM 产品:
表 1. 体系结构中的 IBM 产品
| 产品 | 描述 |
|---|
| WebSphere Edge Server | 加载平衡组件。为门户页面分配传入的请求。 | | IBM HTTP Server V1.3 | 负责提供内容的 Web 服务器。 | | WebSphere Portal V5.0.2 | 用于站点内容、导航、外观、访问第三方组件和通过 Siebel Java Data Bean 访问 Siebel 的用户体验引擎。 | | WebSphere Application Server V5.0.2 | 运行 WebSphere Portal 的 J2EE 应用服务器。 | | IBM Directory Server V5.1 | LDAP 服务器。存储 WebSphere Portal 的站点用户和管理凭据。 | | Lotus Workplace Web Content Management V1.1 | 内容管理组件。支持通过 WebSphere Portal Portlet 编辑内容和向站点用户显示内容。 | | Tivoli Site Analyzer V4.5 | 提供站点使用度量并向站点所有者报告。 | | DB2 V8.1 | 关系数据库。存储内容和其他与站点相关的资产。 | | WebSphere MQ | 支持门户和旧式应用程序之间的 XML 消息交换。 |
这些产品共同带来了有吸引力的网站体验并支持各种事务,包括站点注册、旅游和度假偏好分析,以及在线购买旅游相关产品。该站点的一个关键特征是具备这样的功能:站点所有者可以使用个人概要信息,根据特定站点用户的目标市场策略调整显示的内容。
除了在线事务详细购买信息的捕获之外,个人概要数据的捕获和显示也要求使用 SSL 保护这些门户页面。因为该站点的大多数页面同时提供对匿名用户和注册用户可用的内容,所以使用 SSL 保护整个门户是不切实际的。
挑战
设计团队面临的挑战是提供一种方法来保护门户中的敏感数据,这种方法要符合以下规则:
- 只有请求或显示敏感数据的页面是安全的。
- 安全页面始终显示为安全页面,不管用来导航到该页面的方法是什么。
- 安全页面始终显示为安全页面,不管包含嵌入式 Web 应用程序的 Portlet 的状态是什么。
- 在安全页面中生成的错误或结果也显示为安全页面。
- 从门户中的安全页面导航到不安全页面时,不会在安全会话中呈现该不安全的页面。
- 用户可以识别出该页面是安全的,因为浏览器会用熟悉的锁定符号(或等效标记)来指示。
- 这种方法维护简单,而且可以在将来的站点增强和升级中进行扩展。
解决方案
经过一些研究和试验后,设计团队开发出一种符合以上规则的方法。我们采用以下方式修改以下组件:
- 在 IBM HTTP 服务器上启用 SSL,以便 SSL 流量可以从 Web 服务器流向 WebSphere Portal。
- 配置 WebSphere Portal 以接受 SSL 流量。
- 定义 WebSphere Application Server 中受保护的页面子集。
我们将向您逐一介绍上述修改,以便您了解如何在您自己的环境中应用这种类型的解决方案。
在 IBM HTTP Server 上启用 SSL
这一部分描述在 IBM HTTP Server 上启用 SSL 需要遵循的步骤。
- 备份 IHS_HOME/conf 中的 httpd.conf 文件。
- 编辑 httpd.conf 文件。在所有预先存在的 Load Module 条目下方添加以下条目以加载 IBM SSL 模块:
LoadModule ibm_ssl_module modules/IBMModuleSSL128.dll
|
此条目会使 IBM HTTP Server 在下一次启动时初始化 SSL 模块代码。如果该模块初始化不恰当,IBM HTTP Server 在解释 httpd.conf 文件中所有与 SSL 相关的行时会出现问题。
- 在 httpd.conf 文件结尾处添加:
Listen 443
<VirtualHost <fully qualified machine name>:443>
Keyfile <location of keyfile.kdb>
SSLEnable
SSLClientAuth 0
</VirtualHost>
|
在 httpd.conf 文件中,Listen 条目指定 Web 服务器监视器流经的端口。通过添加条目 Listen 443,可以告诉 IBM HTTP Server 允许通过端口 443 提供内容服务并显示给用户。
重要:端口 443 是缺省的 SSL 端口。
VirtualHost 可以让您配置单台机器以模拟多个主机,其中每个主机都有一个逻辑名称和一个或多个可以通过其获知该主机的 DNS 别名列表。通过添加条目 <fully qualified machine name>:443,您可以让机器通过端口 443 提供安全内容服务,并区分此内容与从端口 80 服务的内容(也就是说,您可以同时使用这两种内容)。确保 keyfile 路径是有效的。如果该 keyfile 路径不存在,则依次创建需要的目录结构以使 IBM HTTP Server 能够发现该文件。SSLEnable 和 SSLClientAuth 条目完成 SSL 的启用。
创建证书
既然您已经使 IBM HTTP Server 能够通过端口 443 提供 SSL 内容服务,您需要导入已签名的证书或者使用 Key Management Utility 创建新的个人证书。以下示例详细介绍创建自签名个人证书的过程。
有关导入证书的做法,请参阅 IBM HTTP Server 产品文档。从 Windows 开始菜单中,选择 开始 => IBM HTTP Server => Start Key Management Utility。
- 从 Key Database File 菜单中,选择 New。
关键数据库类型是 CMS keydatabase 文件,Filename 是您在步骤 3 中使用的 Keyfile。在本例中,我们使用名称 keyfile.kdb。确保 Location 条目与在步骤 3 中引用的条目一致,并且文件系统中存在该路径。
- 单击 OK 继续。
- 键入密码并记住此密码,因为后面需要它!
- 单击选项 Stash the password to a file,它对密码进行编码并保存到文件系统中扩展名为 .sth 的平面文件中。当服务器启动时,它会自动从该 .sth 文件中读取经过编码的密码,不需要提示用户输入。
- 单击 OK。显示此消息。
- 单击OK 关闭该消息框。
- 创建新的自签名证书。选择 Create => New Self-Signed Certificate。
显示“The Create New Self-Signed Certificate”窗口。
- 完成必需的字段:
- Key Label
- <机器名>。在上面的屏幕快照中机器名是 c040
- Version
- X509 V3
- Key Size
- 1024
- Common Name
- <完全限定的机器名>。在上面的屏幕快照中完全限定的机器名是 c040.vancouver.can.ibm.com
- Organization
- <您的组织的名称>。在上面的屏幕快照中组织是 IBM
- Country
- <国家>。在上面的屏幕快照中国家是 US。
- Validity Period
- 在上面的屏幕快照中我们选择 365 天。
确保 Common Name 与 URL 中的主机名相匹配。如果这两个条目不匹配,您将不能提供 SSL 内容。
祝贺您!您已经成功地在端口 443 上为 IBM HTTP Server 启用了 SSL,并且创建了一个证书。
在可以测试该实现之前,您还需要完成两个步骤。
- 打开一个命令行会话并浏览至 IHS_HOME 或 HTTP Server Installation 目录(在我们的示例中是 C:/WebSphere/HTTPServer)。键入此命令以确保在 httpd.conf 文件中没有语法错误:
您应该得到以下结果之一:
我们建议您在测试 SSL 配置之前解决所有错误和警告。如果系统在 SSL 实现之前的某个时候运行时有错误和警告,则在此时也会报告,即使它们不是由实现 SSL 所需要的配置更改造成的。
- 重新启动 IBM HTTP Server 以重新加载具有新的 SSL 启用设置的 httpd.conf 文件。
- 要进行测试,请在 Web 浏览器中打开此地址:
https://<fully qualified machine name>
|
您应该能看到此安全警报:
- 单击 Yes 以继续。如果您看到 Welcome to IBM HTTP Server 窗口(如下所示),则就成功地在您的服务器中启用了 SSL。
如果您不能提供内容,请检查您前面做出的配置更改。
允许 Websphere Portal 接受 SSL
在前一部分,您使 IBM HTTP Server 能够在端口 443 上提供启用了 SSL 的内容。在这一部分,您将看到如何使 WebSphere Portal 接受 SSL。
- 浏览至以下网址,打开 WebSphere Application Server 管理控制台:
https://<fully qualified machine name>:9043/admin/logon.jsp
|
- 单击左栏中的 Environment 链接,然后单击左侧的 Virtual Hosts 链接以显示以下内容:
以配置 IBM HTTP Server 作为多个主机的相同方式在 WebSphere Application Server 中配置 Virtual Hosts,它可以让您配置单台机器以模拟多个主机,其中每个主机都有一个逻辑名称和一个或多个通过其可以获知主机的 DNS 别名列表。
- 在本例中,我们使用的是缺省主机,所以单击缺省主机条目旁边的复选框,然后选择 New 按钮。在本例中,不管要提供的内容类型是什么,主机名都是一样的,所以使用 * 作为主机名。同样,由于我们使用缺省的 SSL 端口,所以可以使用 443 作为端口值。单击 Apply 按钮。
- 在 Save Changes 页面,单击 Save to Master Configuration 框中的 Save 按钮。
您已经成功配置了 WebSphere Portal Server 以提供 SSL 内容。在继续之前,您需要修改 Web Server 插件。
- 单击左侧的 Update Web Server Plugin 链接,然后单击 OK 以重新生成插件文件。
重要:如果您对插件文件做过任何手动更改,则不要重新生成该文件,因为它会改写您的自定义代码。在这种情况下,您需要手动完成对插件文件的任何更改。在我们的例子中,我们已经对插件文件进行过一些手动更改以对后台 Web Content Management 服务器屏蔽机器名和端口,所以我们不使用 WebSphere Application Server 管理控制台来重新生成该文件。
进行手动更改的做法是:
- 备份 WAS_HOME\config\cells 中现有的 plugin-cfg.xml 文件。
- 使用上述指令重新生成插件文件。
- 使用比较工具比较您创建的备份和新创建的文件,并手动进行要从以前手动更改中恢复期望功能所需要的任何更改。
- 保存所有配置更改并关闭 WebSphere Application Server 管理控制台。
- 不管您是自动生成文件还是使用手动过程(在前一步骤中),请打开 plugin-cfg.xml 文件,并进行检查,确保 <VirtualHost Name="*:443"/> 条目与这里突出显示的条目相似:
此条目将 443 Virtual Host 添加到 WebSphere Application Server。
在测试提供 SSL 内容之前,您需要重新启动 IBM HTTP Server 和 WebSphere Portal Server 以重新加载已经添加的 SSL 功能。在接下来的几个部分中将介绍如何实现这一点。
重新启动 IBM HTTP Server
可以使用 Windows Services 面板停止然后重新启动 IBM HTTP Server,如下所示。
重新启动 WebSphere Portal
缺省情况下,WebSphere Portal Server 没有配置为作为 Windows Service 运行。如果您将安装配置为作为 Windows Service 运行,则可以使用 Windows Services 面板停止和重新启动服务器。
否则,使用缺省方式启动和停止 WebSphere Portal Server;也就是通过在命令行中输入命令的方式。
在 WPS_HOME\bin 目录中,使用以下命令停止 WebSphere Portal: stopserver WebSphere_Portal –user <username> -password <password>
|
使用以下命令启动 WebSphere Portal: startserver WebSphere_Portal
|
测试基本的 SSL 功能
打开浏览器窗口,浏览至门户实现的启用了 SSL 的实现: https://<fully qualified hostname>/wps/portal
|
如果您正在使用自签名证书,则会显示如下安全警报。然而,如果您使用行业标准证书,则不会看到这个警告。
检查最后一个条件,该安全证书有一个有效名称与您试图查看的页面名称相匹配,并且有一个绿色的选中标记与之相关联。
第一个条件旁边的黄色感叹号标记(如图所示)表明您在 IBM HTTP Server SSL 启用过程中输入的 Common Name 与机器的主机名不匹配。
单击 Yes 关闭该警告窗口。如果 WebSphere Portal 主页显示正确,则工作完成!如果不行,请确认此刻前面所有步骤都已成功。如果需要帮助以排除故障,请联系 IBM Support(1-800-IBM-SERV,位于美国)。
修改门户主题以使用绝对链接
一旦您已成功完成启用工作(正如前面部分所描述的),则门户就可以通过 SSL 提供任何或所有页面。正如我们在本文“挑战”部分开头所提到的,本项目的目标是能够灵活地保护包含客户敏感信息的少量页面,而不会有对每个页面都启用 SSL 而带来操作开销。限制只对特定页面进行 SSL 加密的副作用是为网站开发人员带来了对安全页面和不安全页面之间导航进行管理的负担。如果使用相对链接(WebSphere Portal 缺省情况下使用的方式),当从安全页面浏览到不安全页面时,SSL 加密依然有效,直到会话结束为止。
在推出对特定页面启用 SSL 的 WebSphere Application Server 之前,我们需要修改门户主题以使用绝对链接(包含 http:// 或 https:// 的链接)。然后,用户可以在安全页面和不安全页面之间导航而不会破坏安全模型。在 WebSphere Portal Version 5.1 中,您可以只修改一个属性文件就将产品配置为在整个站点中使用绝对链接。然而,我们使用的是 WebSphere Portal Server 5.0.2,它没有这项功能。
WebSphere Portal 主题位于这个目录中: WAS_HOME\installedApps\<machine name>\wps.ear\wps.war\themes
|
该主题文件夹包含 chtml、html 和 wml 文件夹,对于每种标记语言,它们对应一种主题版本。
为了使维护简单,以下代码片段构建了缺省的 WebSphere Portal 相对 URL 所缺少的链接部分。 String serverName = request.getServerName();
int portNumber = request.getServerPort();
String preURL = "http://" + serverName;
if (portNumber == 9081) {
preURL = preURL + ":" + portNumber;
|
此函数让您只需将 preURL 放在所有缺省的相对链接之前,就可以创建需要的绝对链接。有许多不同的方法可以解决此问题——只需要确保您的解决方案创建了绝对 URL。
指明对哪些页面启用 SSL
在修改了门户主题之后,您需要做这些更改以使 WebSphere Application Server 能对特定页面启用 SSL。
- 浏览至该文件:
WAS_HOME\config\cells\<machine name
or cluster name>\applications\wps.ear\deployments\wps\wps.war\WEB-INF\web.xml
|
假设您已经成功实现并测试了 SSL 功能,则在该文件中应该有一个条目与此类似:
<security-constraint id="SecurityConstraint_XXXXXXXXXXXXX">
<web-resource-collection id="WebResourceCollection_XXXXXXXXXXXXX">
<web-resource-name>secure</web-resource-name>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
|
<web-resource-name>secure</web-resource-name> 条目枚举了 WebSphere Portal Server 应该使用 SSL 提供内容的安全页面。
- 要枚举特定页面,您需要在此文件中指定每个 URL 模式。
例如:
<web-resource-name>secure</web-resource-name>
<url-pattern>
/portal/!ut/p/.cmd/cs/.ce/7_0_A/.s/7_0_S5/_s.7_0_A/7_0_S5
</url-pattern>
|
指定该 URL(在 <url-pattern> </url-pattern> 对中指定的)应该使用 SSL 来提供。在上述示例中,指定的 URL 是未经过身份验证的页面,但您可以对经过身份验证的页面使用类似的策略。
例如:
<url-pattern>
/portal/!ut/p/.cmd/cs/.ce/7_0_A/.s/7_0_S5/_s.7_0_A/7_0_S5
/myportal/!ut/p/.cmd/cs/.ce/7_0_A/.s/7_0_S5/_s.7_0_A/7_0_S5
</url-pattern>
|
上述示例显示如何指定应该通过 SSL 提供页面的经过身份验证版本和未经过身份验证版本。将这作为枚举每个安全页面的模板。
- 在使用上述过程枚举每个安全页面之后,重新启动 WebSphere Application Server 和 WebSphere Portal。
- 通过浏览至一个安全页面,或者在 Web 浏览器中输入其 URL 来测试该实现,并确认您被重定向到安全页面上。作为提示,安全页面可以很容易地通过浏览器右下角的锁(或其他等效标记)来识别。
重要:如果您是在 WebSphere Portal 集群环境下工作,则需要修改该集群每个节点上的 web.xml 文件。该文件位于: WAS_HOME\config\cells\cluster name>\applications\wps.ear\deployments\wps\wps.war\WEB-INF\web.xml
|
在该单元目录中可以找到多个条目,但您只需要关心集群的那个条目。
- 使用前面描述的 stopserver 和 startserver 命令重新启动每个节点,并测试实现。好的做法是测试每个独立集群节点上的所有页面以确保它们都是安全提供的。这可以在本地使用位于每个 WebSphere Portal Server 集群节点上的 Web 浏览器来实现。

 |

|
结束语
总的来说,团队学习了以下关于在 Websphere Portal 部署中保护特定页面的内容。
- 保护特定门户页面是可能的。团队证明,保护 Websphere Portal 实现并不一定就是全是或全否的决定。上述技术允许团队用一种有效和可维护的方式保护特定页面以满足客户的安全需要。
- 保护特定门户页面需要进行自定义配置。正如前面所描述的,保护特定门户页面需要的步骤不少。如果有许多页面要保护,或者客户频繁地添加安全页面,则保护整个门户可能更为简单。
- 在用户界面设计过程中确定安全页面。在用户界面设计阶段建立要保护的页面列表可以方便配置规划、测试和部署。如果在项目日程表中延迟了这个活动,则可能需要重新配置和重新测试。
参考资料
作者简介  | 
|  | Greg Herringer 是一位在 Customer Relationship Management 和 Contact Center 技术方面有着 15 年经验的 IT 架构师,他主要从事金融服务和公共部门行业。他对整个应用程序开发生命周期有着丰富的经验。 |
 | 
|  | Zaman Valli-Hasham 是一位 IT 专家,在位于英属哥伦比亚的 Burnaby 的 Pacific Development Centre 工作。他在各种领域均有涉足,包括 Web 强制转换、Web 开发和应用程序开发。目前他正在从事 WebSphere 部署管理和基础设施配置。 |
对本文的评价
|