作者:自由的猪 制作整理:左岸网络http://www.leftworld.net

第15章 安全

Eric Jendrock著

Iceshape Zeng译

J2EE平台提供了与具体应用程序安全实现机制无关的编程模型,这种无关性提高了应用程序的可移植性,使应用程序可以部署在不同的安全环境中。本章假定读者已经了解了基本的安全概念,如果读者还需要学习这些概念,我们强烈建议读者学习The Java Tutorial一书的Security部分(http://java.sun.com/docs/books/tutorial/security1.2/index.html)。

本章内容:

纵览

安全角色

声明和连接角色引用

映射角色到J2EE用户和组

Web层安全

保护Web资源

控制Web资源访问

验证Web资源用户

使用编程安全机制

不受保护的Web资源

EJB层安全

声明方法许可

使用编程安全机制

不受保护的EJB层资源

应用程序客户端层安全

确定应用程序客户端的回调处理机制

EIS(Enterprise Information System)层安全

配置契约

容器管理的契约

组件管理的契约

配置资源适配器安全

传递安全身份

配置组件使用的传递安全身份

配置客户端验证机制

J2EE用户、域和组

管理J2EE用户和组

安装服务器证书

一.纵览

J2EE平台定义了应用程序组件的开发与装配者和运行环境中的应用程序配置者之间的声明性约定(The J2EE platform defines declarative contracts between those who develop and assemble application components and those who configure applications in operational environments.)在应用程序的安全上下文中,应用程序提供者要提供在能完全满足应用程序配置要求的声明机制。在应用程序中声明性安全机制都被表示成部署描述符中的声明语法。应用程序部署者使用各种J2EE服务器的不同工具将部署描述符描述的应用程序安全需求映射到J2EE容器实现的安全机制。J2EE SDK用deploytool工具实现这个功能。

编程安全机制是指用安全敏感的程序来实现安全控制。当声明性安全无法满足应用程序的安全模型的表达时,编程安全就很有用。例如,应用程序可能需要实现基于当天某个时间、方法调用参数、企业Bean或者Web组件的内部状态等的安全授权机制,或者根据数据库中的用户信息约束访问权限等就需要用编程安全机制。

J2EE应用程序都是由可以部署在不同容器中的各种组件组成的。这些组件通常用来创建多层企业级应用程序。J2EE安全体系的目的是在实现各层安全的基础上实现各层相关联的应用程序整体安全。

每一层都有受保护资源和非保护资源。通常你要确认受保护资源只有授权用户可以访问,授权机制提供受保护资源的访问控制。授权机制基于识别和验证,它通常作为允许访问系统资源的先决条件。识别是能够“认出”系统实体的过程。验证是校验计算机系统的用户、设备或者其他实体的身份的过程。

访问非保护资源不需要授权机制。因此访问非保护资源也不需要验证。访问系统资源而不需要授权被称作未验证或匿名访问。

二.安全角色

当你设计一个企业Bean或者Web组件的时候,你总是会考虑什么样的用户可以访问这个组件。例如,一个Account企业Bean可以被客户、银行出纳员和分行经理访问。这些用户类型中的每一种都被称作安全角色——一个由应用程序组装者定义的抽象逻辑用户组。当应用程序部署时,部署者将把这些角色映射到运行环境的安全实体。

一个J2EE用户组也代表一个用户分类,但是它和角色有不同的范围。J2EE用户组被指定到整个J2EE服务器,而角色只覆盖一个特定的应用程序。

你可以为应用程序中的JAR或者WAR文件声明角色来创建一个角色。下面是一个用deploytool部署工具创建角色的步骤的示例:

1. 选中企业Bean的JAR文件或者Web组件的WAR文件

2. 在Roles页签里,点击Add按钮

3. 在表格中输入Name和Description列的值

声明和连接角色引用

一个安全角色引用允许一个企业Bean或者Web组件引用一个已经存在的安全角色。一个安全角色是一个应用程序相关的逻辑用户组,他们按照如消费水平或者职务等共同特性被分类。当应用程序被部署时,角色被映射到运行环境中的principals(作为验证结果赋予用户的安全身份的集合)或者用户组这样的安全实体。(When an application is deployed, roles are mapped to security identities, such as principals (identities assigned to users as a result of authentication) or groups, in the operational environment.)基于它,一个有特定角色的用户就有了相应的J2EE应用程序访问权。连接指明被引用安全角色的实际名称(The link is the actual name of the security role that is being referenced.)。

在应用程序装配时,装配者为应用程序创建安全角色,并把这些安全角色关联到可用的安全机制中。装配者再通过连接单个的Servlet或者JSP到应用程序定义的角色来分配角色引用。

安全角色引用定义了角色名(程序可引用名)和应用程序定义的安全角色名之间的映射,通过该引角色名,在Web组件中可以调用isUserInRole(String name)(见Web层安全一节的使用编程安全机制)函数,在EJB组件中可以调用isCallerInRole(String name)(见EJB层安全一节的是用编程安全机制)函数。例如:映射安全角色引用名cust到名为bankCustomer的安全角色的步骤为:

1. 选中要引用安全角色的Web组件或者企业Bean

2. 选择Security页签

3. 如果cust并没有出现在Role Names Referenced In Code板块,点击Add按钮

4. 在Coded Name列输入cust

5. 在Role Name列的下拉列表中选择bankCustomer

如果在下拉列表中没有bankCustomer选项,点击Edit Roles按钮添加该角色

6. 点击最后一列的纸页图标再弹出的对话框中为cust添加描述文字,点击OK。

配置好后,isUserInRole(“bankCustomer”)和isUserInRole(“cust”)都将返回true,并对Method Permissions面板中描述的方法都有访问权限。

因为代码中的引用名是通过连接映射到角色名的,所以你可以随时更改角色名而不需要修改代码。例如你要修改bankCustomer的角色名,你不必修改编码中的cust名,而只需要将cust的连接重新映射到bankCustomer的新角色名。

映射角色到J2EE用户和组

当你在开发一个J2EE应用程序的时候,你应该知道用户的角色,但是可能你并不知道确切的用户是谁。这被很好的体现在J2EE的安全体系中,在你的组件被发布后,J2EE服务器的系统管理员会将安全角色映射到缺省域的用户或者组。在AccountBean的例子中,管理员可能会将管理员的角色赋给用户Sally,而只给用户Bob、Ted和Clara三人Teller的角色。

管理员在deploytool工具中通过如下步骤将角色映射到J2EE用户和组:

1.选中J2EE应用程序

2.在安全页签中,在Role Name列表中选中相应的角色

3.点击Add按钮

4.在弹出的Users对话框中选择属于该角色的用户和组(用deploytool创建用户和组将在J2EE用户、域和组一节的管理J2EE用户和组部分中讲述)

三.Web层安全

本节讲述Web层的受保护资源和验证用户。

保护Web资源

你可以通过制定安全约束来保护Web资源。安全约束决定谁通过验证可以访问受保护的Web资源,这些资源是URL和HTTP请求的列表。安全约束可以在deploytool部署工具中设置,具体操作将在后面介绍。

如果你是还没有通过验证的用户,当你访问受保护的Web资源的时候,Web容器将验证你的访问权限。容器只有在你被证明具有该资源的访问权限的时候才接受你的请求。

控制Web资源访问

根据一下步骤,在deploytool中可以设置对Web资源的访问控制

1.选中存放Web资源的WAR节点

2.选中Security页签

3.在Security Contraints中点击Add按钮

4.点击Web Resource Collection域的Add按钮添加将受安全约束的Web资源及和名称,点击下面的Edit按钮配置该安全约束的Web资源集合。

5.点击Authorized Roles域的Edit按钮添加角色到该安全约束,这些角色才被允许访问这些受保护的Web资源

Web资源访问的用户验证

当你试图访问一个受保护的Web资源的时候,Web容器将激活为该资源设置好的验证机制。你可以配置以下几种验证机制:

☆ HTTP原始验证

☆ 基于FORM的验证

☆ 客户端证书验证

原始验证

如果使用原始验证,Web服务器将通过从客户端获得的用户名和密码验证该用户。

基于Form的验证

如果使用基于基于Form的验证,可以在HTTP浏览器为最终用户自定义登录页面和错误提示页。

不管是原始验证还是基于Form的验证都不能确保安全。在基于Form的验证中用户会话通过普通文本传递,而且目标服务器是没有通过验证的(In form-based authentication, the content of the user dialog box is sent as plain text, and the target server is not authenticated.)。原始验证使用UUENCODE编码在Internet上传递用户名和密码,但是没有加密。这种基于Form的验证使用Base64编码,仍然很容易暴露你的用户名和密码,除非你的所有连接都在SSL上进行。如果有人中途截取这些数据,解码得到用户名和密码是再简单不过的事。

客户端证书验证

客户端证书验证是比上两种方法更安全的验证方法。它使用基于SSL的HTTP(HTTP over SSL ,HTTPS),在此,服务器和客户端(可选)使用公匙证书验证每一个用户。SSL(Secure Sockets Layer 安全套接层)提供数据加密、服务器验证、消息完整性验证和可选的客户端TCP/IP连接验证。你可以把公匙证书看作数字护照,它由可信任的被称为证书授权机构(CA)的组织发给,并给信息发送者提供安全证明。如果使用客户端正书验证,Web服务器将使用X.509证书来验证客户端,该证书跟X.509公匙下属机构定义的标准公匙证书一致。

配置Web资源的验证机制

配置WAR文件中的Web资源步骤:

1.选中WAR节点

2.选中Security页签

3.在User Authentication Method下拉列表中选择None、Basic、客户端证书和基于Form的验证机制中的一种

a) 如果使用基于From的验证,必须点击Settings按钮并再弹出的对话框中设置相应的选项:Realm Name、Login Page和Error Page。用户无法通过登录验证时将显示Error Page。

b) 如果使用原始验证,必须在Settings对话框中将Realm Name设置为Defailt

使用SSL增强原始验证和基于Form验证安全性

原始验证和基于Form的验证都无法保证密码的机密性,为了克服这个缺陷,可以使该验证协议运行在SSL保护会话中并确定所有的消息内容都受到该协议保护。

以下步骤配置SSL上的安全验证:

1.选中Web组件(WAR节点)

2.在Security页签中确定在User Authentication Method下来列表中选中Basic或者Form Based

3.在Security Constraint域中点击Add按钮

4.选中刚才添加的Security Constraint实体

5.在Network Security Requirement下拉列表中选中CONFIDENTIAL

使用编程安全机制

编程安全机制是在声明性安全机制无法有效的表达应用程序的安全模型时使用安全敏感的应用程序的方法。编程安全机制由HttpServletRequest接口的以下几个方法组成:

☆ getRemoteUser

☆ isUserInRole

☆ getUserPrincipal

getRemoteUser方法被用来确定客户端被验证的用户名,isUserInRole方法被用来确定用户是否具有指定的安全角色,getUserPrincipal方法返回一个java.security.Principal对象。

这些API允许servlet基于远程用户的逻辑角色决定商业逻辑,而且允许servlet确定当前用户的principal。

不受保护的Web资源

很多应用程序包含不受保护的Web内容,任何用户都可以不通过验证访问这些资源。在Web层,只需要不配置验证机制就可以支持无限制的自由访问。

四.EJB层安全

本节介绍针对EJB层应受保护资源的声明性安全机制和编程安全机制。受保护资源包括被应用程序客户端、Web组件和其他企业Bean调用的企业Bean方法。

通过一下方法可以保护EJB层资源:

☆ 声明方法许可

☆ 映射角色到J2EE用户和组

声明方法许可

定义角色后,就可以定义企业Bean的方法许可。方法许可指示什么角色被允许调用什么方法。

在deploytool部署工具中通过映射角色到方法指定方法许可:

1.选中企业Bean节点

2.选中Security页签

3.在Method Permissions表格中,在Availability列的下拉列表中选中Sel Roles

4.在该列后的对应被允许调用该方法的角色列中选中它的复选框(没有角色Availability列后就没有列了)

使用编程安全机制

编程安全机制由getCallerPrincipal方法和isCallerInRole方法构成。GetCallerPrincipal方法决定企业Bean的调用者,isCallerInRole方法获得调用者的角色。

GetCallerPrincipal方法在EJBContext接口中定义,该方法返回标志企业Bean调用者身份的java.security.Principal对象,(在这种情况下,一个principal就等同于一个用户),下面的例子中getUser方法通过调用该方法返回调用它的J2EE用户名。

public String getUser() {

return context.getCallerPrincipal().getName();

}

调用isCallerInRole方法可以确定企业Bean的调用者是否属于某个特定角色:

boolean result = context.isCallerInRole("Customer");

不受保护的EJB层资源

缺省情况下,J2EE SDK将ANYONE角色赋给方法。不被信任的用户guest属于ANYONE角色。然而如果你不为方法绑定角色,任何用户将都可以访问企业Bean的方法。

五.应用程序客户端层安全

J2EE应用程序客户端的验证需求和其他J2EE组件的验证需求一样,访问受保护资源需要通过用户验证,非保护资源则不需要。

应用程序客户端可以使用Java验证和授权服务(Java Authentication and Authorization Service ,JAAS)来建立验证机制。JAAS实现了Java版的标准可插入安全模块(Pluggable Authentication Module ,PAM)体系,该体系使应用程序独立于底层的安全技术实现。你可以为应用程序插入一个新的或者更换原有的验证技术而不需要对应用程序本身做任何修改。应用程序通过实例化一个LoginContext对象来激活验证处理,该对象轮流引用决定验证技术的验证配置或者用来执行验证功能的登录模块。

一个典型的登录模块提示用户输入用户名和密码并作校验。其他模块甚至可以读取和校验声音或者指纹样本。

有些情况下,登录模块需要和用户通信以获得验证信息。它使用javax.security.auth.callback.CallbackHandler接口来达到该目的,应用程序实现该接口并将其对象传递给登录上下文,该上下文直接将收到的对象交给底层的登录模块。登录模块用回调处理机制收集用户输入(例如密码和智能卡PIN号码等)也给用户返回信息(如状态信息)。通过允许应用程序定义回调处理,可以使底层登录模块和不同的应用程序与用户交互的方法保持独立。

例如回调处理可以被实现为GUI应用程序显示一个窗口要求用户输入,或者被实现为一个命令行工具简单的提示用户直接在命令行中输入。

登录模块传递适当的回调实现的数组给回调处理器的handle方法(例如为用户名提供的NameCallback实现和为密码提供的PasswordCallback实现),回调处理器被请求用户的交互并给回调设置相应的值。例如,对于NameCallback,CallbackHandler也许提示需要用户名,并从用户获取,然后调用NameCallback的setName方法存放该用户名。

确定应用程序客户端的回调处理机制

在deploytool部署工具中按一下步骤配置应用程序的回调处理机制:

1.选中应用程序客户端的JAR节点

2.选中General页签

3.在CallbackHandler Class下来列表中选定用来收集用户验证数据的CallbackHandler实现类

六.EIS(Enterprise Information System)层安全

在EIS层,一个应用程序组件请求一个EIS资源的连接,EIS需要对该资源的一个契约作为该连接的一部分。应用程序组件提供者有两种方式来设计EIS连接契约:

☆ 容器管理的契约,应用程序让容器来负责配置和管理EIS契约。容器保存建立EIS连接的用户名和密码。

☆ 组件管理的契约,应用组件编码管理EIS契约,包括编码实现EIS契约建立过程

组件提供者可以使用deploytool部署工具来选择企业类型

配置契约

按一下步骤在deploytool部署工具中配置契约类型:

1. 选择需要使用EIS连接的组件

2. 选中Resource Refs页签

3. 点击Add按钮

4. 如果实容器管理的契约,在Authenticatication下拉列表中选中Container。如果是组件管理的契约则选中Application。

容器管理的契约

使用容器的契约,应用程序组件不需要传递任何安全验证信息给连接该资源的getConnection()方法。安全验证信息由容器提供,如下面的例子:

// Business method in an application component

Context initctx = new InitialContext();

// perform JNDI lookup to obtain a connection factory

javax.resource.cci.ConnectionFactory cxf =

     (javax.resource.cci.ConnectionFactory)initctx.lookup(

      "java:comp/env/eis/MainframeCxFactory");

// Invoke factory to obtain a connection. The security

// information is not passed in the getConnection method

javax.resource.cci.Connection cx = cxf.getConnection();

...

组件管理的契约

使用组件管理的契约,应用程序组件负责安全验证信息给连接资源的getConnection方法。安全验证信息一般是用户名和密码,如下面的例子:

// Method in an application component

Context initctx = new InitialContext();

// perform JNDI lookup to obtain a connection factory

javax.resource.cci.ConnectionFactory cxf =

     (javax.resource.cci.ConnectionFactory)initctx.lookup(

       "java:comp/env/eis/MainframeCxFactory");

// Invoke factory to obtain a connection

com.myeis.ConnectionSpecImpl properties = //..

// get a new ConnectionSpec

properties.setUserName("...");

properties.setPassword("...");

javax.resource.cci.Connection cx =

  cxf.getConnection(properties);

...

配置资源适配器安全

除了为EIS资源配置契约,还要配置资源适配器的安全机制。步骤如下:

1. 选中资源适配器RAR(Resource Adapter Archive)节点

2. 选中Security页签,在验证机制方框中选择该资源适配器支持的验证机制

☆ Password:EIS连接需要验证用户名和密码

☆ Kerberos Version 5.0:该资源适配器支持Kerberos验证机制(参考RFC-1510,The Kerberos Network Authentication Service(v5),该规范可以在http://www.ietf.org/rfc/rfc1510.txt.找到)

也可以选择0到多种验证机制。如果没有选择任何验证机制,则不支持任何安全验证。

3. 如果资源适配器支持队以存在的EIS连接进行再次验证,选中Reauthentication Supported。应用服务器在和当前连接的安全上下文环境不同的上下文中调用getConnection()方法时也将使用再次验证功能。

4. 在Security Permissions方各种,点击Add按钮添加运行环境中资源适配器需要访问系统资源的安全许可。这里只需要指定缺省安全许可以外的许可,要了解缺省安全许可请查看J2EE连接体系规范1.0(J2EE Connector Architecture Specification 1.0)的11.2节的表2。

5. 对每一个安全许可,点击最后一列的纸页图标为该许可输入描述文字。

删除许可只需选中该许可,然后点击Delete按钮。

七.传递安全身份

当你部署企业Bean或者Web组件的时候,可以指定在企业Bean和调用它的组件间可传递的安全身份。如图15-1:

图15-1 安全身份的传递

你可以选择下列传递方式之一:

☆ 中介组件(调用者)的安全身份被传递给目的企业Bean(被调用者)。只有目的容器信任中介容器才能使用该技术。

☆ 一个特定安全身份被传递给目的企业Bean。当目的容器期望访问通过一个特定的安全身份时使用该技术。

配置组件使用的传递安全身份

使用deploytool部署工具选择从企业Bean或者Web组件传递的安全身份。

配置企业Bean或者Web组件可传递组件运行时的调用者安全身份(调用其他组件时的安全身份)的步骤:

1. 选中该组件

2. 选中Security页签

3. 在Security Indentity方框中,选中Use Caller ID单选钮(表示组件将使用调用者的安全身份ID)

配置组件传递特定安全身份步骤:

1. 选中组件

2. 选中Security页签

3. 在Security Indentity方框中,选中Run As Specified Role单选钮

4. 在下拉列表中选中指定的角色

5. 点击Deployment Settings指定该角色的一个用户

6. 在Run As Specified User列表中选择用来调用企业Bean的用户名

7. 点击OK确定

配置客户端验证机制

当应用程序组件在客户端容器中需要访问受保护的Bean方法的时候使用客户端验证。

在deploytool部署工具中配置客户端验证机制的步骤如下:

1. 选择目的企业Bean

2. 选中Security页签

3. 点击Deployment Settings弹出Security Deployment Settings对话框

4. 选中SSL Required复选框激活SSL

5. 在Client Authentication方框中,选中Certificate。该选项使客户端如期望的为服务器作自我验证。(select Certificate as the method by which the server expects the client to authenticate itself to the server.)

6. 点击OK按钮确定。

容器间的信任机制

当企业Bean被设计成不管是用原始调用者的身份或者指定的身份调用目的Bean时,目的Bean只能得到被传递的安全身份时,它将无法得到任何验证数据。

我们没有方法是目的容器验证被传递的安全身份。然而,因为安全身份被用来做授权检查(例如方法许可和isCallerInRole方法),所以安全身份的可信度至关重要。又由于传递的安全身份没有可用的验证数据,所以目的组件必须信任调用者容器传递了一个已通过验证的安全身份。

缺省情况下,J2EE SDK服务器的配置信任来自各种不同容器的安全身份。因此,不必要用另外的步骤来设置信任关系。

八.J2EE用户、域和组

一个J2EE用户类似一个操作系统用户。很明显,两种用户都表示人。然而这两种用户并不相同,J2EE的验证服务并不知道你登录操作系统时的用户名和密码,因为该服务并不连接操作系统的安全机制。这两种安全服务管理属于不同域的用户。

域是指被相同的安全验证规则约束的用户集合。J2EE验证服务在两个域中管理用户:证书和缺省域。

证书通常在HTTPS协议中被用来验证Web浏览器客户端。为了在证书域中验证一个用户的身份,验证服务检验该用户的X.509证书。具体操作参考下一节安装服务器证书。X.509证书的公用名字段被用来作为principal名。

大多数情况下,J2EE验证服务通过缺省域验证用户身份,缺省域用来验证除Web浏览器客户端之外的所有用户。Web浏览器客户端使用HTTPS协议和证书验证。

一个缺省域的J2EE用户可以属于J2EE组(证书域的用户不能属于该组)。J2EE组是按职务或者消费水平等共有特点分类的用户类别。例如电子商务应用的大多数顾客可能都属于CUSTOMER用户组,而大客户却属于PREFERRED用户组。将用户分类到用户组使控制大量用户的访问权变的更简单。(EJB层安全一节讲述了如何控制企业Bean的用户访问。)

管理J2EE用户和组

本小节介绍如何使用deploytool部署工具实现如下功能:

☆ 在缺省域中显示所有用户

☆ 向缺省域中添加一个用户

☆ 向证书域中添加一个用户

☆ 删除一个用户

☆ 为缺省域添加一个用户组(证书域不能添加用户组)

☆ 从缺省域中删除一个用户组

显示缺省域或者证书域中的所有用户:

1.中要添加用户或者组的目的服务器

2.选择ToolàServer Configuration菜单显示Configuration Instrallation窗口

3.在J2EE树节点下选中Users子节点

4.在下拉列表中选择域类型(缺省Default或者证书Certificate)

向缺省域添加一个用户:

1.点击Add User按钮

2.输入用户名和密码

3.在Group Membership方框中从Available Groups列表中选择该用户将属于的组点击Add按钮添加到Groups列表中

4.点击OK按钮确定

为缺省域添加用户组:

1. 在Add User对话框中点击Edit Croups按钮

2. 在弹出的Groups窗口中点击Add

3. 在新行中输入用户组名

4. 点击OK确定

删除一个用户组只需在上述的Groups窗口中选中要删除的组点击Delete按钮,然后OK确定。

向证书域中添加一个用户

1. 选择Certificate证书域

2. 点击Add User按钮

3. 选择证书存放的目录

4. 选中证书文件名

5. 点击OK确定

九.安装服务器证书

证书被用来在HTTPS协议中验证验证Web客户端。除非服务器证书被安装,否则J2EE服务器不会激活HTTPS服务。安装服务器证书步骤如下:

1. 生成一对密匙和自签名证书

你可以用keytool工具创建证书。J2EE SDK携带的keytool工具和J2SE SDK携带的keytool工具用法相同。不过J2EE SDK版的keytool增加了执行RSA算法得Java加密扩展(Java Cryptogra Extension)支持。该功能允许你引入RSA签名的证书。

使用如下命令创建证书(用你的证书别名代替命令中的<certificate-alias>,用你的密匙存放文件名代替<keystore-filename>):

keytool -genkey -keyalg RSA -alias <certificate-alias> -keystore <keystore-filename>

2. keytool工具会提示你如下信息(我试运行了一下发现提示是中文的,这就是国际化了):

a) 输入keystore密码(Keystore password):输入密码(你可以使用changeit作为密码以和J2EE SDK的keystore密码保持一致)

b) 您的姓氏和名字是什么?(First and last name)[unknown]:输入你的服务器的有效全名,包括主机名和域名。

c) 您的组织单位名称是什么?(Organizational unit)[unknown]:输入组织单位名称

d) 您的组织名称是什么?(Organizational)[unknown]:输入组织名称

e) 您所在的城市或区域名称是什么?(City or locality)[unknown]:jinhua

f) 您所在的州或省份名称是什么?(State or province)[unknown]:zhengjiang

g) 该单位的两字母国家代码是什么(Two-letter country code)[unknown]:cn

h) 以上输入结束会让你确认上述输入是否正确,……[否]:输入y确认

i) 输入<certificate-alias>的主密码(如果和keystore密码相同,按回车)(key password for alias):password

3. 导入证书

如果你的证书用CA而不用Verisign签名,你必须导入CA证书(用Verisign Test CA签名也必须导入证书)。否则可以省略该步骤。导入证书步骤:

a) 从你的CA处申请CA证书,并保存到文件。

b) 用如下命令将该CA证书安装到Java 2平台标准版(Java 2 Platform, Standard Edition)(你必须有修改$JAVA_HOME/jre/lib/security/cacerts文件的权限):

keytool -import -trustcacerts -alias <ca-cert-alias> -file <ca-cert-filename>

4. 如果你想让你的证书具有CA的数字签名,步骤如下:

a) 生成一个证书签名请求(Certificate Signing Request ,CSR):

keytool -certreq -sigalg MD5withRSA -alias <cert-alias> -file <csr-filename>

b) 将<csr-filename>的内容发去签名。如果你使用Verisign CA,发送到http://digitalid.verisign.com/。Verisign将通过电子邮件发回签名证书。将该证书保存到文件。

c) 将电子邮件收到的签名证书导入服务器:

keytool -import -alias <cert-alias> -file <signed-cert-file>