站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题J2EE平台安全(原著是《J2EE Tutorial》)

J2EE平台安全(原著是《J2EE Tutorial》)

摘要: J2EE平台安全(原著是《J2EE Tutorial》)

安装并配置SSL支持

什么是Secure Socket Layer技术?

Secure Socket Layer(SSL)是一种允许Web浏览器和Web服务器基于一种安全的连接方式连接起来的技术。在这种安全的连接中,要传输的数据在被传输前会被加密,然后在接到后立刻在处理数据前解密。浏览器和服务器都会在发送任何数据前,加密所有的传输内容。SSL主要处理下面的重要安全事项。

l 认证

在你的初始尝试与Web服务器基于安全连接的通讯时,服务器将给你的Web浏览器一个以服务器证书形式存在的证书集合。这个证书的目的就是验证这个site是谁,并且他声称是什么。在某些情况下,服务器可能需要一个关于客户端是谁,他声称是什么的证书(这被称作客户端的认证)。

l 机密性

当数据在互联网上客户端和服务器间传送时,第三方能够看见并截获数据。SSL的应答是被加密的,所以数据不会 被第三方解密,可以保持机密性。

l 完整性

当数据在互联网上客户端和服务器之间传送时,第三方可以看见并截获数据。SSL有助于保证数据不会再传输过程中被第三方修改。

要在你的独立Web服务器上安装并配置SSL支持,你需要以下的构件。如果你正在使用J2EE1.4 应用服务器,那么SSL支持就已经被提供了。如果你正在使用一个别的Web服务器,那么参考你的产品文档。

l 服务器证书密钥商店(参考Setting Up Digital Certificates,page 933)。

l HTTPS连接器(参考配置SSL连接器,page 939)。

为了验证SSL支持已经可用,参考验证SSL Support(page 939)。

安装数字证书

注意:J2EE1.4应用服务器的数字证书已经被产生并且可以在目录/domains/domain1/config中找到。

为了使用SSL,J2EE服务器对于每个外在接口或者IP地址必须有个关联的证书,这可以达到安全的连接。这种设计的原理是一个服务器必须提供某种合理的关于此保证的拥有者是你认为的谁的保证,特别是在接收某些敏感的信息之前。认为证书是一种对于网络地址的数字的司机驾照的想法是有用的。它表明了这个site是与哪个公司联系起来的,同时说明了关于site所有者或者administrator的一些基本联系信息。

数字证书时被它的拥有者加密签名的,并且很难被其他人伪造。对于包含在电子商务里的站点,或者其他一些身份的认证十分重要的商业交易,证书可以从著名的证书授权机构(CA)比如Verisign或者Thawte购买。

如果认证不是真的重要,比如如果administrator只是简单的想确认被服务器传输和接收的数据是私有的,并且不能被监听这次连接的某个人偷窃,你可以简单的通过使用自己签名的证书来节省购买CA证书的时间和花费。

SSL使用公钥加密,这是基于密钥对的。密钥对包括一个公钥和一个私钥。如果数据用一个钥匙加密,那么它只能用另一个钥匙解密。这一特性是在传输中建立信任和秘密的基础。举个例子,使用SSL,服务器计算了一个值并使用私钥加密这个值。加密过的值称为数字签名。客户端使用服务器的公钥解密这个加密的值,并把这个值和自己的计算值比较。如果这两个值匹配,客户端就可以信任这个签名是认证过的,因为只有私钥可以用来产生这样一个签名。

数字证书被用于在HTTPS协议中认证Web客户端。大多数Web服务器的HTTPS服务不会运行,除非数字证书被安装了。使用下面的大概的过程来建立能够被你的Web服务器用来激活SSL的数字证书。

一个可以被用来建立数字证书的工具是keytool,它是个J2EE1.4应用服务器自带的密钥和证书管理工具。它使用户可以管理他们自己的公钥私钥对和相关的证书,为了在self-authentication(用户要向别的用户或者服务认证自己)或者数据完整性和用数字签名的认证服务时使用。它也允许用户隐藏他们联系人的公钥(以证书的方式)。要更好的理解key-tool和公钥加密,请阅读keytool文档,URL如下:

http://java.sun.com/j2se/1.4.2/docs/tooldocs/solaris/key-tool.html

创建服务器证书

服务器的证书已经为J2EE1.4应用服务器创建了。证书可以在/domains/domain1/config/目录下找到。服务器证书在keystore.jks中。客户端证书在cacerts.jks文件中。

如果必要,你可以用keytool来产生证书。Keytool在一个与keystore对应的文件中存储了密钥和证书。Keystore是一个存储用于确认客户端和服务器的证书的仓库。典型的,一个keystore包含一个客户端或者一个服务器的身份。默认的keystore把keystore当作一个文件。它用一个密码保护私钥。

keystore是在你运行keytool的目录下创建的。这个目录可以是应用所在的目录,也可以是许多应用共用的目录。

为了创建一个服务器证书,

1.创建keystore。

2.从keystore中导出证书。

3.签名证书。

4.把证书导入一个trust-store中。Trust-store是指一个用于检验证书的证书仓库。一个trust-store典型的包含多于一个证书。一个使用trust-store基于SSL的相互认证的例子将在Example:Client-Certificate Authentication over HTTP/SSL with JAX-RPC(page 950)中讨论。

运行keytool来产生服务器的keystore,我们把它取名为server-key-store.jks。这一步使用别名server-alias来产生一个新的公钥和私钥对,并把公钥打包入server-keystore.jks的一个self-signed证书中。这个密钥对是用RSA算法和一个默认的changeit密码产生的。要获得更多关于keytool选项的信息,请查阅它的在线帮助,地址是

http://java.sun.com/j2ee/1.4.2/docs/tooldocs/solaris/keytool.html。

在你想创建keystore的目录下带着下面的参数运行keytool。当你按下Enter时,keytool提示你输入服务器名字,组织单位,组织,位置,国家,国家编码。注意你必须输入服务器的名字在对keytool的第一个提示的应答中,它需要first和last name。抱着试验的目的,可以是localhost。keystore中指定的主机必须与定义在主机变量/j2eetutorial14/examples/common/buid.properties中的匹配。

1.产生服务器证书。

<JAVA_HOME>\bin\keytool -genkey -alias server-alias-keyalg RSA -keypass changeit -storepass changeit-keystore keystore.jks

2.把 keystore.jks中产生的证书导出到文件server.cer中。

<JAVA_HOME>\bin\keytool -export -alias server-alias

-storepass changeit -file server.cer -keystore keystore.jks

3.如果你想要拥有一个CA签发的证书,请阅读Signing Digital Certificates(page 937)获得更多信息。

4.要创建trust-store文件cacerts.jks并把服务器证书添加到这个trust-store中,就要在你创建keystore和服务器证书的目录下以如下的参数运行keytool。

\bin\keytool -import -v -trustcacerts

-alias server-alias -file server.cer

-keystore cacerts.jks -keypass changeit

-storepass changeit

证书的信息,比如下面展示的将显示出来。

<INSTALL>/j2eetutorial14/examples/gs 60% keytool -import

-v -trustcacerts -alias server-alias -file server.cer

-keystore cacerts.jks -keypass changeit -storepass changeit

Owner: CN=localhost, OU=Sun Micro, O=Docs, L=Santa Clara,

ST=CA, C=US

Issuer: CN=localhost, OU=Sun Micro, O=Docs, L=Santa Clara,

ST=CA, C=US

Serial number: 3e932169

Valid from: Tue Apr 08

Certificate fingerprints:

MD5: 52:9F:49:68:ED:78:6F:39:87:F3:98:B3:6A:6B:0F:90

SHA1: EE:2E:2A:A6:9E:03:9A:3A:1C:17:4A:28:5E:97:20:78:3F:

Trust this certificate? [no]:

5.输入yes,然后敲击Enter或者Return键。将出现如下的信息。

Certificate was added to keystore

[Saving cacerts.jks]

签发数字证书

一旦你创建了数字证书,你会想让它被它的所有者签名。一旦数字证书被它的所有者加密签名,他就很难被其他人伪造。对于电 子商务的网站或者其他身份认证很重要的商业事务中,证书可以向著名的证书授权机构(CA)比如Verisign或者Thawte购买。

如果认证不是很重要,比如如果administrator只是想简单的确认被服务器传输和接收的数据是私有的并且不会别其他监听该连接的偷听到,你可以简单地通过使用self-signed证书来节省购买CA证书所需的时间和花费。

为了相互认证创建一个客户端证书

这一节讨论安装一个客户端的认证。当服务器和客户端的认证都可以用时,被称为相互或者双向的认证。在客户端认证,客户端需要提交由你选择接受的CA发布的证书。在你想要创建客户端证书的目录下像下面给出的那样运行keytool。当你按下Enter时,keytool提示你输入服务器名,组织单位,组织,地址,国家,国家代码。注意你必须输入服务器的名字在对keytool的第一个提示的应答中,它需要first和last name。抱着试验的目的,可以是localhost。keystore中指定的主机必须与定义在主机变量/j2eetutorial14/examples/common/buid.properties中的匹配。

要创建一个名为client-keystore.jks的keystore,它包含名为client.cer的客户证书,按照下面的步骤:

1.创建客户证书。

<JAVA_HOME>\bin\keytool -genkey -alias client-alias -keyalg

RSA -keypass changeit -storepass changeit

-keystore keystore.jks

2.把产生的客户证书导出到client.cer文件中。

<JAVA_HOME>\bin\keytool -export -alias client-alias

-storepass changeit -file client.cer -keystore keystore.jks

3.添加证书到trust-store文件cacerts.jks中。在你创建keystore和客户证书的目录下以下面的参数运行keytool:

\bin\keytool -import -v -trustcacerts

-alias client-alias -file client.cer

-keystore cacerts.jks -keypass changeit

-storepass changeit

Keytool返回如下信息:

Owner: CN=J2EE Client, OU=Java Web Services, O=Sun, L=Santa

Clara, ST=CA, C=US

Issuer: CN=J2EE Client, OU=Java Web Services, O=Sun, L=Santa

Clara, ST=CA, C=US

Serial number: 3e39e66a

Valid from: Thu Jan 30 18:58:50 PST 2003 until: Wed Apr 30

19:58:50 PDT 2003

Certificate fingerprints:

MD5: 5A:B0:4C:88:4E:F8:EF:E9:E5:8B:53:BD:D0:AA:8E:5A

SHA1:90:00:36:5B:E0:A7:A2:BD:67:DB:EA:37:B9:61:3E:26:B3:89:46:

32

Trust this certificate? [no]: yes

Certificate was added to keystore

一个使用相互认证的例子应用程序,参看Example: Client-Certificate Authentication over HTTP/SSL with JAX-RPC(page 950)。为了获得关于验证相互的认证在运行的信息,参看 Verifying Mutual Authentication is Running(page 941)。

多种关于证书的命令

l 要检验包含证书的keystore的内容,用别名server-alias:

keytool -list -keystore keystore.jks -alias server-alias -v

l 检验cacerts文件的内容:

keytool -list -keystore cacerts.jks

配置SSL连接器

一个SSL连接器是预先为J2EE1.4 应用服务器配置好的。你不需要配置任何东西。

验证SSL支持

抱着测试,和验证SSL支持已经被正确的安装的目的,用一个连上在服务器部署描述符中定义的端口的URL,载入默认的介绍页面:

https://localhost:1043

在这个URL中的https表明浏览器应该正在使用SSL协议。在本例子中的localhost假设你正在你的本地机器上运行这个例子作为部署过程的部分内容。在例子中的1043是被指定的在配置SSL连接器(page 939)时SSL连接器创建的位置的安全端口。如果你正在使用一个不同的服务器或者端口,相应的改变这个值。

用户第一次载入这个应用时,New Site Certificate或者Security Alert dialog 会显示出来。选择Next来通过一系列的对话,当你到了最后的对话时选择Finish。证书将只在第一次的时候显示出来。当你接受这些证书时,网站以后的行为将会认为你信任这些内容。

运行SSL的一般提示

SSL协议被设计成尽可能有效率和安全。可是,加密/解密是一个从执行角度看很花费计算的过程。在SSL上运行一个完整的Web应用是不十分必须的,并且让一个开发者决定哪个页面需要安全连接,哪个不需要,是符合惯例的。可能需要安全连接的页面包括登录页面,个人信息页面,购物车的付款,或者信用卡信息需要被传输的页面。在一个应用中的任何页面可以被简单在地址前面加上https:替代http:来通过secure socket请求。任何绝对请求安全连接的页面需要检查与这一页对应的协议的类型,并在如果https:没有被指定时采取合适的动作。

在安全连接上使用基于名字的实际主机是被质疑的。这是SSL协议自身设计上的局限。客户端浏览器接受服务器证书的SSL握手必须在HTTP请求被访问之前发生。结果,包含实际主机名的请求信息不能在认证前被判断,并且这也是不可能对于一个IP地址签发多个证书的原因。如果所有的基于一个IP地址的实际主机需要认证同一个证书,那么多个主机的地址就应该在服务器上不干扰普通的SSL操作。但是要知道,多数客户端浏览器将比较服务器的域名和证书中列出的域名,如果域名不匹配,那么浏览器将向客户显示警告。一般来说,在产品环境的SSL中普遍使用只有基于地址的主机。

开启基于SSL的相互认证

这一节讨论安装客户端的证书。当服务器和客户端的认证都可以用时,被称为相互或者双向的认证。在客户端认证,客户端需要提交由你选择接受的CA发布的证书。至少有有两种方法开启客户端认证。不管你选择哪种,你都必须输入keystore的位置和在Web服务器配置文件中的密码来开启SSL,就像在Configuring the SSL Connector(page 939)中讨论的那样。这两种开启基于SSL的相互认证方法如下:

l 设置在证书域中clientAuth为true。按下面步骤来完成设置,

a.如果你还没有启动应用服务器,就启动它。启动应用服务器的信息可以在Starting and Stopping the J2EE Application Server(page 91)中找到。

b.启动Admin Console。启动Admin Console的信息可以在Starting the Admin Console(page 92)中找到。

c.在Admin Console树中,展开Security,然后展开Realms,并选择certificate。证书域被用于基于带着SSL的HTTP的所有传输。

d.选择Add来把clientAuth的属性添加到服务器上。在名字里输入clientAuth,在值里输入true。

e.点击Save来保存这些新的属性。

f.登出Admin Console。

当你通过设置clientAuth属性为true开启客户端的认证时,客户端的认证将被所有的通过指定SSL端口的请求采用。

l 使用部署工具把认证的方法设置为Client-certificate。通过这种开启客户端认证的方式,客户端的认证只是对被安全约束控制的指定资源有效。以这种方式设置客户端认证将在Example:Client-Certificate Authentication over HTTP/SSL with JAX-RPC(page 950)中讨论。

当客户端认证以上述两种方法开启后,客户端认证将被执行两次。

检验相互的认证正在运行

你可以通过获得debug信息来检验相互的认证正在工作。这要在客户端完成,并且这个例子展示了如何传递在targets.xml中的一个系统属性来让targets.xml产生一个在系统属性中有javax.net.debug的客户,这可以被添加到例如/j2eetutorial14/examples/security/common/targets.xml文件中。

为了使SSL相互认证的debug信息可用,要传递系统属性javax.net.debug=ssl,handshake,这可以提供关于相互认证是否运行的信息。下面的例子按照/j2eetutorial14/examples/

security/common/targets.xml文件定义了run-mutualauth-client任务,是通过像粗体演示的那样添加sysproperty:

description="Runs a client with mutual authentication over

SSL">

${trust.store} ${trust.store.password}

${endpoint.address}" />

handshake" />

value="${key.store}" />

value="${key.store.password}"/>