使用安全套接字层 (SSL) 进行安全通信

安全套接字层 (SSL) 协议提供传输层安全性,包括真实性,数据签名和数据加密,以确保客户机与使用 WebSphere® Application Server的服务器之间的安全连接。 SSL 的基本技术是公用密钥密码术,该技术可以保证当某个实体使用公用密钥对数据进行加密后,只有具备相应的专用密钥的实体才能对该数据进行解密。

WebSphere Application Server 使用 Java™ 安全套接字扩展 (JSSE) 作为安全连接的 SSL 实现。 JSSE 是 Java 2 Standard Edition (J2SE) 规范的一部分,包含在 Java 运行时扩展 (JRE) 的 IBM® 实现中。 JSSE 负责处理 SSL 提供的握手协商和保护功能,以确保大多数协议之间能够建立安全连接。 JSSE 依赖基于 X.509 证书的非对称密钥对来保护安全连接和进行一些数据加密。 密钥对可有效地对基于会话的密钥进行加密,而基于会话的密钥可对大型数据块进行加密。 SSL 实现负责管理 X.509 证书。

WebSphere Application Server 随附 Java SE7。 缺省情况下,Java SE 7 启用了服务器名称指示 (SNI)。 SNI 是对 TLS 协议的扩展。 SNI 允许客户机指定其尝试连接的主机名。 如果返回的证书与期望的主机名不匹配,那么将抛出异常。

在某些代理环境中,这可能会导致错误。 客户机期望接收到代理的证书,但却接收到端点服务器的证书。

管理 X.509 证书

WebSphere Application Server 的安全通信需要数字签名的 X.509 证书。 X.509 证书的内容(例如,它的专有名称和截止日期)由认证中心 (CA) 签名、NodeDefaultRootStoreDmgrDefaultRootStore 中的根证书签名或者自签名。 当可信 CA 签署 X.509 证书时, WebSphere Application Server 将标识该证书并自由分发该证书。 由于一个实体通过证书来向公众表明它的身份,因此必须由 CA 为证书签名。 接受来自公众的连接的服务器端端口必须使用经过 CA 签名的证书。 由于大多数客户机或浏览器都已具有可用来验证 X.509 证书的签署者证书,因此,不需要交换签署者就可以成功地进行连接。

只有在受控环境(如内部网络通信)中的同代接受签署者证书时,您才能信任自签名 X.509 证书的身份。 要完成可信握手,必须首先将实体证书的副本发送至连接至该实体的每个同代。

CA 证书,链式证书和自签名 X.509 证书位于 Java keystores中。 JSSE 提供了对存放证书的密钥库的引用。 您可以从多种类型的密钥库中进行选择,包括基于 Java 加密扩展 (JCE) 的密钥库和基于硬件的密钥库。 通常,每个 JSSE 配置都有两个 Java 密钥库引用: 一个密钥库和一个 truststore。 密钥库引用表示保存个人证书的 Java 密钥库对象。 信任库引用表示保存签署者证书的 Java 密钥库对象。

没有专用密钥的个人证书就是表示在握手期间拥有该证书的实体的 X.509 证书。 个人证书同时包含公用密钥和专用密钥。 签署者证书是一个表示同级实体或者它本身的一个 X.509 证书。 签署者证书只包含公用密钥,并且验证在对等握手期间接收到的实体的签名。

有关更多信息,请参阅 将正确的 SSL 签署者证书添加到插件密钥库

有关密钥库的更多信息,请参阅 SSL 的密钥库配置

签署者交换

配置 SSL 连接时,可以交换签署者以在 personal certificate 中为特定实体建立信任。 签署者交换使您可以从同代密钥库中抽取 X.509 证书并将它添加到另一个实体的信任库中,从而使这两个同级实体之间能够建立连接。 签署者证书还能以根签署者证书、链式证书的根签署者证书或中间签署者证书的形式来源于 CA。 您还可以直接从自签名证书 (即具有公用密钥的 X.509 证书) 中抽取 signer certificate

图 1 显示了假想的密钥库和信任库配置。 SSL 配置将确定哪些实体可以连接至其他实体,以及 SSL 握手信任的同代连接。 如果没有必需的签署者证书,那么会由于不能信任同代而导致握手失败。
图 1。 签署者交换
图 1 显示了假想的密钥库和信任库配置。 SSL 配置将确定哪些实体可以连接至其他实体,以及 SSL 握手信任的同代连接。 如果没有必需的签署者证书,那么会由于不能信任同代而导致握手失败。

在此示例中,实体 A 的信任库包含三个签署者。 只要这三个签署者中的任何一个验证实体 A 的个人证书,实体 A 就可以连接至任何同代。 例如,由于签署者可以信任实体 B 或实体 C 的已签名个人证书,因此,实体 A 可以连接至实体 B 或实体 C。 实体 B 的信任库包含一个签署者。 实体 B 只能连接至实体 C,并且仅当同代端点正在使用证书 Entity-C Cert 1 作为标识时才能连接。 实体 B 不会信任使用实体 C 的其他个人证书的端口。实体 C 只能连接至实体 A。

在该示例中,自签名配置似乎表示签署者与证书之间的一一对应关系。 但是,当 CA 为证书签名时,它通常一次会生成多个签名。 使用单个 CA 签署者的优点在于它可以验证由 CA 生成的供同代使用的个人证书。 但是,如果签署者是一个公众 CA,那么您必须知道可能已经为目标实体之外的另一个公司生成了已签名的证书。 对于内部通信,公众 CA 将首选专用 CA 和自签名证书,因为它们使您可以将想要建立的连接隔离开,同时阻止您不想建立的那些连接。

SSL 配置

SSL 配置包含一组配置属性,您可以将这些属性与 WebSphere Application Server 拓扑中的端点或端点集相关联。 SSL 配置使您可以创建 SSLContext 对象,该对象是服务器用来获得 SSL 套接字工厂的基本 JSSE 对象。 您可以管理下列配置属性:
  • SSLContext 对象的别名
  • 握手协议版本
  • 密钥库引用
  • 信任库引用
  • 密钥管理器
  • 一个或多个信任管理器
  • 在对密码套件分组或者列示特定密码套件时选择安全性级别
  • 客户机与服务器连接时选择证书别名
要了解每个 SSL 配置属性的具体情况,请参阅 SSL 配置
注: 缺省情况下, WebSphere 不允许 HIGH 密码列表中的 RC4 密码套件使服务器更安全。 在进行此更改之前,缺省情况下,可以在 SSL 握手中使用 RC4 密码。 通过移除 RC4 密码,可以改为使用 AES 密码。 用户在使用更安全的 AES 密码时,可能会遇到性能下降的情况。

选择 SSL 配置

在 WebSphere Application Server的先前发行版中,只能通过直接选择 SSL 配置别名来引用 SSL 配置。 每个安全端点是由引用 SSL 配置指令表中的有效 SSL 配置的一种别名属性表示的。 更改单个配置时,必须重新配置各个进程中的多个别名引用。 尽管当前发行版仍然支持直接选择,但是建议您不要再使用此方法。

当前发行版改善了用于管理 SSL 配置的功能并且能够更灵活地选择 SSL 配置。 在此发行版中,可以选择采用下列方法:
按程序进行选择
您可以 在出站连接之前在正在运行的线程上设置 SSL 配置。 WebSphere Application Server 确保大多数系统协议 (包括因特网 ORB 间协议 (IIOP) , Java 消息服务 (JMS) ,超文本传输协议 (HTTP) 和轻量级目录访问协议 (LDAP)) 接受配置。
动态选择
您可以使用预定义的选择标准 将 SSL 配置与特定目标主机,端口或出站协议动态关联 。 建立连接时, WebSphere Application Server 会检查目标主机和端口是否符合包含主机的域部分的预定义条件。 另外,可以为特定出站 SSL 配置预定义协议和选择证书别名。

安全套接字层配置的动态出站选择基于可用于服务器的连接信息,以便在 com.ibm.websphere.ssl.protocol.SSLSocketFactory 中创建客户机套接字时,服务器能够与出站协议、主机或端口相匹配。 对于 SOAP 和远程方法调用 (RMI) 之类的 WebSphere 管理连接器,连接信息保存在线程中,并且可用于进行动态出站选择。 当检索到类似于 使用 JSSEHelper API 以编程方式指定出站 SSL 配置中描述的 SSL 属性时,动态出站选择过程将对正在设置的连接信息进行应答。

从客户编写的应用程序进行出站连接时,部分连接信息可能不可用。 这些应用程序中的某些应用程序对协议进行 API 调用以建立连接。 API 最终会调用 com.ibm.websphere.ssl.protocol.SSLSocketFactory 中的其中一个 createSocket() 方法以完成此过程。 动态出站选择的所有连接信息可能都不可用,您可能必须调整动态出站选择连接过滤器,并为缺少的部分连接信息填写星号 (*)。 举例来说,对 URL 目标的 openConnection() 调用最终会调用 createSocket(java.net.Socket socket, String host, int port, boolean autoClose)。 可以使用提供的主机和端口构建连接信息,但是未提供协议。 在这种情况下,应使用通配符星号 (*) 作为动态选择连接信息的协议部分。

大多数 createSocket() 方法将主机或 IP 地址以及端口作为参数。 可以使用主机和端口来构建动态出站选择连接过滤器。 除非已使用连接信息将套接字工厂实例化,否则,不附带任何参数的缺省方法 createSocket() 将不包含任何用于构建出站选择连接过滤器的信息。如果未提供连接信息,那么您应该考虑使用“按程序进行选择”主题中描述的其他某种选择 SSL 配置的方法,这可能是较好的选择。

避免麻烦: WebSphere Application Server 依赖于传递到 WebSphere Application Server SSL 套接字工厂的主机,端口和协议信息。 配置设置或应用程序可以绕过 WebSphere Application Server SSL 套接字工厂,即:
  1. java.security 文件不包含 WebSphere Application Server 套接字工厂的规范。
  2. 应用程序直接调用另一个套接字工厂。
如果是 (1) 或 (2) ,那么将绕过动态 SSL 出站选择过程,并且不会建立连接。
直接选择
与前发行版一样,可以使用特定别名来选择 SSL 配置。 由于许多应用程序和进程都需要别名引用,因此,保留了此选择方法以保持向后兼容性。
选择作用域
可以使 SSL 配置及其证书别名(位于与该 SSL 配置相关联的密钥库中)与 WebSphere Application Server 管理作用域相关联。 建议采用此方法来集中管理 SSL 配置。 由于各个端点都位于单元的一个拓扑视图中,因此可以更高效地管理这些端点。 由于作用域之间存在继承关系,因此减小了必须设置的 SSL 配置指定数。
每当使 SSL 配置与单元作用域相关联时,单元中的节点作用域就会自动继承配置属性。 但是,当对节点指定 SSL 配置时,该节点配置就会覆盖节点从单元中继承的配置。 同样,一个节点的所有应用程序服务器会自动继承该节点的 SSL 配置(除非您覆盖这些指定)。 除非覆盖特定配置,否则,拓扑将依赖每个应用程序服务器的从单元级别到端点级别的继承规则。
注: 如果应用程序依赖于设置为拓扑中每个 SSL 配置的单独设置的 SSL 配置,但应用程序服务器继承了从单元级别向下部署到端点级别的 SSL 配置,那么服务器之间可能会发生通信错误 (例如,握手错误)。 您需要确保应用程序的运行方式与 SSL 配置的中央管理一致。
拓扑视图显示入站树和出站树。 根据服务器连接至哪个对象作为出站连接以及服务器连接至哪个对象作为入站连接,可以为 SSL 连接的每一端选择不同的 SSL 配置。 有关更多信息,请参阅 集中管理 SSL 配置
因为您可以采用多种方法来选择 SSL 配置,所以运行时使用优先顺序来确定要选择哪个 SSL 配置。 当选择配置方法时,应考虑以下优先顺序:
  1. 按程序进行选择。 如果应用程序使用 com.ibm.websphere.ssl.JSSEHelper 应用程序编程接口 (API) 对正在运行的线程设置 SSL 配置,那么会保证该 SSL 配置具有最高优先顺序。
  2. 出站主机、端口或协议的动态选择标准。
  3. 直接选择。
  4. 选择作用域。 作用域的继承性可保证所选端点与 SSL 配置相关联,并且被它下面的不会覆盖此选择的每个作用域继承。

缺省链式证书配置

缺省情况下, WebSphere Application Server 会为每个节点创建唯一的链式证书。 链式证书通过存储在 DmgrDefaultRootStoreNodeDefaultRootStore 中的根证书或自签名证书进行签名。 WebSphere Application Server 不再依赖于自签名证书或产品随附的缺省证书或哑元证书。 缺省密钥库 key.p12 和信任库 trust.p12 存储在节点目录下的配置库中。 缺省根证书存储在节点目录下配置库的 root-key.p12 中。

当联合基本应用程序服务器时,将发生下列情况:将密钥库和信任库包括在内,并将签署者证书添加至 Deployment Manager 公共信任库,公共信任库位于配置库的单元目录中。

所有节点都将其来自缺省根证书的签署者证书放在此公共信任库 (trust.p12) 中。 此外,在联合节点后,将自动修改缺省 SSL 配置以指向位于单元目录中的公共信任库。 现在,该节点就可与单元中的所有其他服务器进行通信了。

所有缺省 SSL 配置中都包含一个名称后缀为 DefaultKeyStore 的密钥库、一个名称后缀为 DefaultTrustStore 的信任库以及一个名称后缀为 DefaultRootStore 的根密钥库。 这些缺省后缀指示 WebSphere Application Server 运行时将个人证书的根签署者添加到公共信任库。 如果信任库名称不是以 DefaultKeyStore 结尾,那么在联合服务器时就不会将密钥库根签署者证书添加至公共信任库。 您可以更改缺省 SSL 配置,但是必须确保为其他服务器之间的管理连接建立正确的信任关系。

有关更多信息,请参阅 SSL 中的缺省链式证书配置 [AIX Solaris HP-UX Linux Windows]SSL 中的 Web 服务器插件缺省配置

证书到期监视

证书监视确保每个节点的缺省链式证书不会到期。 在将证书和签署者设置为到期之前,证书到期监视功能将发出警告。 可以监视位于 WebSphere Application Server 配置所管理的密钥库中的那些证书和签署者。 可以将到期监控器配置为自动替换证书。 将根据初始创建时使用的相同数据来重新创建链式证书,并使用对原始证书进行签名的同一根证书对重新创建的证书进行签名。 自签名证书或链式证书也将根据初始创建时使用的相同数据重新创建。

监视器还可以自动将旧签署者替换为 WebSphere Application Server管理的密钥库中的新链式证书或自签名证书中的签署者。 将保留由运行时在联合期间以及由管理操作进行的现有签署者交换。 有关更多信息,请参阅 SSL 中的证书到期监视

到期监视器已配置为替换由 DmgrDefaultRootStore 或 NodeDefaultRootStore 中的根证书进行签署的链式个人证书。 将通过用来对原始证书进行签名的同一根证书来更新该证书。

监视器还可以自动将旧签署者替换为 WebSphere Application Server所管理的密钥库中的新自签名证书中的签署者。 将保留由运行时在联合期间以及由管理操作进行的现有签署者交换。 有关更多信息,请参阅 SSL 中的证书到期监视
重要信息: 对于已到期的证书链或已到期的认证中心 (CA) 证书链,您需要更新 整个 链。 您必须生成具有各个签署者证书的新证书链。 对于 CA 证书链,这可能需要导入新的证书链,通常通过新的证书请求文件 (CSR)。

WebSphere Application Server 客户机: 签署者-交换需求

在每个节点初始启动期间都会生成一个新的链式证书。 为了确保可信,必须为客户机提供根签署者以建立连接。 在当前发行版中引入链式证书使此过程变得更简单。 您将不会交换生存期较短的自签名证书的签署者,而是交换生存期较长的根签署者,这将允许在个人证书更新期间保持信任关系。 此外,您还可以访问客户机必须使用以下任一选项连接到的各种节点的签署者证书 (有关更多信息,请参阅 安全安装以在 SSL 中检索客户机签署者):
  • 在连接至服务器期间,签署者交换提示使您可以导入信任库中尚不存在的签署者证书。 缺省情况下,将为管理连接启用此提示,并且可以为任何客户机 SSL 配置将它启用。 启用了此提示之后,先前与尚不存在签署者的服务器之间建立的任何连接都会提供服务器的签署者,还会提供证书信息以及证书的“安全散列算法”(SHA) 摘要用于验证。 将让用户选择是否接受这些凭证。 如果接受这些凭证,那么会将签署者添加至客户机的信任库,直到显式移除该签署者为止。 除非更改了个人证书,否则在连接至同一服务器时不会再次出现签署者交换提示。
    注意: 在不验证 SHA 摘要的情况下信任签署者交换提示是不安全的。 当证书不可信时,未经验证的提示可能来源于浏览器。
  • 在与服务器建立连接之前,可以在客户机中运行 retrieveSigners 管理脚本。 下载签署者时并不需要管理权限。 但是要上载签署者,就必须具有管理员角色权限。 该管理脚本将所有签署者从指定服务器信任库下载到指定的客户机信任库中,还可以调用该脚本来从信任库中只下载特定别名。 另外,还可以调用该脚本来将签署者上载到服务器的信任库中。 当您选择 CellDefaultTrustStore 信任库作为一个单元的指定服务器信任库和公共信任库时,将该单元的所有签署者下载至指定的客户机信任库(通常为 ClientDefaultTrustStore)。 有关更多信息,请参阅 retrieveSigners 命令
  • 可以将位于配置库的单元目录中的公共信任库 trust.p12 以物理方式分发至客户机。 但是,在执行此分发时,必须确保在客户机 SSL 配置文件 ssl.client.props 中指定了正确的密码。 此信任库的缺省密码为 WebAS。 在分发之前应更改缺省密码。 物理分发并不像先前的选项一样有效。 更改服务器上的个人证书时,自动交换可能会失败。

动态 SSL 配置更改

WebSphere Application Server 的 SSL 运行时维护大多数 SSL 连接的侦听器。 更改 SSL 配置将导致入站连接侦听器创建新的 SSLContext 对象。 而现有连接将继续使用当前的 SSLContext 对象。 当尝试出站连接时,它们会自动使用新的配置属性。

在非高峰时段对 SSL 配置进行动态更改,以降低发生与时间长短有关的问题的可能性,同时还可以防止服务器再次启动。 如果让运行时接受动态更改,那么更改 SSL 配置并保存 security.xml 文件。 当每个节点中存在新的 security.xml 文件时,您所作的更改就会生效。

注: 如果配置更改导致 SSL 握手失败,那么还可能发生管理连接失败,这可能导致中断。 在这种情况下,必须重新配置 SSL 连接,然后手动执行节点同步以解决该问题。 完成任何动态更改时都必须谨慎。 强烈建议您在测试环境上对 SSL 配置执行更改之后才对生产系统执行相同的更改。

内置证书管理

现在,已将与 iKeyMan 功能相当的证书管理功能集成到管理控制台的密钥库管理面板中。 使用内置证书管理功能来管理位于密钥库中的个人证书、证书请求和签署者证书。 另外,可以远程管理密钥库。 例如,可以从 Deployment Manager 中管理位于任何节点的配置库外部的基于文件的密钥库。 还可以从 Deployment Manager 中远程管理硬件密钥库。

借助内置证书管理功能,通过连接至远程 SSL 主机和端口并在握手期间拦截签署者,可以替换链式证书或自签名证书以及散布在许多信任库中的所有签署者证书,还可以从远程端口中检索签署者。 首先将根据证书 SHA 摘要来验证证书,然后管理员必须接受经过验证的证书之后才能将它放入信任库中。

当发出证书请求时,可以将它发送至认证中心 (CA)。 当返回证书时,可以在管理控制台中接受它。
提示: 虽然 iKeyMan 功能仍随 WebSphere Application Server一起提供,但请使用内置证书管理功能从管理控制台配置密钥库。 在不方便使用管理控制台的情况,仍然可以使用 iKeyMan。 有关更多信息,请参阅 在 SSL 之前使用 iKeyman 进行证书管理

AdminTask 配置管理

管理控制台中的 SSL 配置管理面板主要依赖于管理任务,维护和增强这些管理任务以支持管理控制台功能。 您可以使用来自 Java 控制台提示符的 wsadmin 命令来自动管理密钥库, SSL 配置和证书等。