安装 Application Server 时将生成一个适用于内部测试的 NSS(Network Security Services,网络安全服务)格式的数字证书。默认情况下,Application Server 将其证书信息存储在 domain-dir/config 目录下的证书数据库中:
密钥库文件 key3.db 中包含 Application Server 的证书及其专用密钥。密钥库文件受密码保护。使用 asadmin change-master-password 命令可以更改该密码。有关 certutil 的更多信息,请参见使用 certutil 实用程序。
每个密钥库条目都有唯一的别名。安装后,Application Server 密钥库会有一个别名为 s1as 条目。
信任库文件 cert8.db 中包含 Application Server 的信任证书和其他实体的公共密钥。对于信任证书,服务器已确认证书中的公共密钥属于证书的拥有者。信任的证书通常包括那些证书授权机构 (CA) 的证书。
在 Platform Edition 的服务器端,Application Server 使用 JSSE 格式,该格式使用 keytool 来管理证书和密钥库。在 Enterprise Edition 的服务器端,Application Server 使用 NSS 格式,该格式使用 certutil 来管理存储专用密钥和证书的 NSS 数据库。在两种版本的客户端(应用程序客户端或独立客户端)上均使用 JSSE 格式。
默认情况下,Application Server 配有一个密钥库和一个信任库,它们将与示例应用程序配合使用并用于开发目的。在用于生产目的时,您可能需要更改证书别名、将其他证书添加到信任库或更改密钥库文件和信任库文件的名称和/或位置。
为开发提供的密钥库和信任库文件存储在 domain-dir/config 目录中。
在管理控制台树中,展开“配置”。
展开 server-config(管理配置)节点。
选择“JVM 设置”节点。
单击“JVM 选项”选项卡。
在“JVM 选项”页面中,在“值”字段中添加或修改以下值来反映证书文件的新位置:
-Dcom.sun.appserv.nss.db=${com.sun.aas.instanceRoot}/NSS-database-directory |
其中 NSS-database-directory 是 NSS 数据库的位置。
单击“保存”。
如果控制台中显示“必须重新启动”,请重新启动 Application Server。
使用 keytool 可以设置和使用 JSSE(Java Secure Socket Extension,Java 安全套接口扩展)数字证书。在 Platform Edition 中,Application Server 在服务器端使用 JSSE 格式来管理证书和密钥库。在 Platform Edition 和 Enterprise Edition 中,客户端(应用程序客户端或独立客户端)均使用 JSSE 格式。
J2SE SDK 附带了 keytool,因而允许管理员管理公共/专用密钥对和关联证书。还允许用户高速缓存正与其通信的另一方的公共密钥(以证书形式)。
要运行 keytool,必须先配置 shell 环境以使 J2SE /bin 目录位于路径中;或者必须在命令行中提供此工具的完整路径。有关 keytool 的更多信息,请参见 http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/keytool.html 上的 keytool 文档。
以下示例说明了使用 JSSE 工具处理证书的相关用法:
使用 RSA 密钥算法在 JKS 类型的密钥库中创建自签名证书。RSA 是 RSA Data Security, Inc. 开发的公共密钥加密技术。RSA 缩略词分别代表该技术的三位发明者:Rivest、Shamir 和 Adelman。
keytool -genkey -noprompt -trustcacerts -keyalg RSA -alias ${cert.alias} -dname ${dn.name} -keypass ${key.pass} -keystore ${keystore.file} -storepass ${keystore.pass} |
使用 keytool 实用程序生成证书中显示了创建证书的另一个示例。
使用默认密钥算法在 JKS 类型的密钥库中创建自签名证书。
keytool -genkey -noprompt -trustcacerts -alias ${cert.alias} -dname ${dn.name} -keypass ${key.pass} -keystore ${keystore.file} -storepass ${keystore.pass} |
使用 keytool 实用程序为数字证书签名中显示了一个为证书签名的示例。
显示 JKS 类型的密钥库中可用的证书。
keytool -list -v -keystore ${keystore.file} -storepass ${keystore.pass} |
显示 JKS 类型的密钥库中的证书信息。
keytool -list -v -alias ${cert.alias} -keystore ${keystore.file} -storepass ${keystore.pass} |
将 RFC/文本格式的证书导入 JKS 库。通常,使用 Internet RFC(Request for Comments,请求注释)1421 标准定义的可打印编码格式(而非其二进制编码)来存储证书。此证书格式也称为 Base 64 编码,便于通过电子邮件或某些其他机制将证书导出到其他应用程序。
keytool -import -noprompt -trustcacerts -alias ${cert.alias} -file ${cert.file} -keystore ${keystore.file} -storepass ${keystore.pass} |
以 PKCS7 格式从 JKS 类型的密钥库中导出证书。公共密钥加密标准 #7 加密消息语法标准定义的回复格式包括发布的证书以及支持证书链。
keytool -export -noprompt -alias ${cert.alias} -file ${cert.file} -keystore ${keystore.file} -storepass ${keystore.pass} |
以 RFC/文本格式从 JKS 类型的密钥库中导出证书。
keytool -export -noprompt -rfc -alias ${cert.alias} -file ${cert.file} -keystore ${keystore.file} -storepass ${keystore.pass} |
从 JKS 类型的密钥库中删除证书。
keytool -delete -noprompt -alias ${cert.alias} -keystore ${keystore.file} -storepass ${keystore.pass} |
使用 keytool 实用程序删除证书中显示了从密钥库中删除证书的另一个示例。
使用 keytool 可以生成、导入和导出证书。默认情况下,keytool 将在其运行所在的目录中创建一个密钥库文件。
转至要运行证书的目录。
始终在包含密钥库和信任库文件的目录中生成证书,默认目录为 domain-dir/config。有关更改这些文件位置的信息,请参见更改证书文件的位置。
输入以下 keytool 命令以在密钥库文件 keystore.jks 中生成证书:
keytool -genkey -alias keyAlias-keyalg RSA -keypass changeit -storepass changeit -keystore keystore.jks |
使用任一唯一的名称作为您的 keyAlias。如果您已更改密钥库或专用密钥密码的默认值,请将以上命令中的 changeit 替换为新密码。
将显示一个要求您输入姓名、组织和其他信息的提示,keytool 将使用这些信息来生成证书。
输入以下 keytool 命令以将生成的证书导出到文件 server.cer(或 client.cer,如果您愿意):
keytool -export -alias keyAlias-storepass changeit -file server.cer -keystore keystore.jks |
如果需要证书授权机构签名的证书,请参见使用 keytool 实用程序为数字证书签名。
要创建信任库文件 cacerts.jks 并将证书添加到信任库中,请输入以下 keytool 命令:
keytool -import -v -trustcacerts -alias keyAlias -file server.cer -keystore cacerts.jks -keypass changeit |
如果您已更改密钥库或专用密钥密码的默认值,请将以上命令中的 changeit 替换为新密码。
工具将显示有关证书的信息并提示您是否要信任该证书。
键入 yes,然后按 Enter 键。
然后,keytool 将显示与下面类似的信息:
Certificate was added to keystore [Saving cacerts.jks] |
重新启动 Application Server。
创建数字证书之后,拥有者必须为其签名以防止伪造。电子商务站点或身份验证对其很重要的那些站点可以从知名的证书授权机构 (CA) 购买证书。如果无需考虑验证,例如当专用安全通信可以满足全部需求时,则可节省获取 CA 证书所花费的时间和费用并使用自签名证书。
按照 CA Web 站点上的说明进行操作来生成证书密钥对。
下载生成的证书密钥对。
将证书保存在包含密钥库和信任库文件的目录中,默认目录为 domain-dir/config。请参见更改证书文件的位置。
在 shell 中,转至包含证书的目录。
使用 keytool 将证书导入到本地密钥库和本地信任库(如有必要)。
keytool -import -v -trustcacerts -alias keyAlias -file server.cer -keystore cacerts.jks -keypass changeit -storepass changeit |
如果密钥库或专用密钥密码不是默认密码,请将以上命令中的 changeit 替换为新密码。
重新启动 Application Server。
要删除现有证书,请使用 keytool -delete 命令,例如:
keytool -delete -alias keyAlias -keystore keystore-name -storepass password
有关 -delete 命令的可能选项的完整列表,请参阅 http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/keytool.html 上的 keytool 文档。
在 Enterprise Edition 中,在服务器端使用网络安全服务 (NSS) 数字证书可以管理存储专用密钥和证书的数据库。对于客户端(应用程序客户端或独立客户端),均使用使用 Java 安全套接口扩展 (Java Secure Socket Extension, JSSE) 工具中介绍的 JSSE 格式。
通过网络安全服务 (NSS) 管理安全性的工具包括:
certutil,一个命令行实用程序,用于管理证书和密钥数据库。使用 certutil 实用程序中显示了一些使用 certutil 实用程序的示例。
pk12util,一个命令行实用程序,用于以 PKCS12 格式在证书/密钥数据库和文件之间导入和导出密钥及证书。使用 pk12util 实用程序导入和导出证书中显示了一些使用 pk12util 实用程序的示例。
modutil,一个命令行实用程序,用于管理 secmod.db 文件中或硬件令牌中的 PKCS #11 模块信息。使用 modutil 添加和删除 PKCS11 模块中显示了一些使用 modutil 实用程序的示例。
这些工具位于 install-dir/lib/ 目录中。下面的环境变量用于指出 NSS 安全性工具的位置:
LD_LIBRARY_PATH =${install-dir}/lib
${os.nss.path}
在示例中,证书通用名 (Common Name, CN) 是客户机或服务器的名称。在 SSL 握手时也会使用 CN,以比较证书名称和生成证书名的主机名。如果证书名称与主机名不匹配,在 SSL 握手时会产生警告或异常。在某些示例中,使用证书通用名 CN=localhost 是为了方便起见,这样所有用户都可以使用该证书,而不必用他们自己的真实主机名创建一个新证书。
以下各节中的示例说明使用 NSS 工具处理证书的相关用法:
证书数据库工具 certutil 是一个 NSS 命令行实用程序,可以创建和修改 Netscape Communicator cert8.db 和 key3.db 数据库文件。还可以列出、生成、修改或删除 cert8.db 文件中的证书,以及创建或更改密码、生成新的公共和专用密钥对、显示密钥数据库的内容或删除 key3.db 文件中的密钥对。
密钥和证书管理进程通常以在密钥数据库中创建密钥开始,然后在证书数据库中生成和管理证书。位于以下网址的文档说明了使用 NSS(包括 certutil 实用程序的语法)管理证书和密钥数据库:http://www.mozilla.org/projects/security/pki/nss/tools/certutil.html。
下表中的每一项都给出了一个使用 NSS 和 JSSE 安全性工具来创建和/或管理证书的示例。
生成自签名服务器和客户机证书。在本示例中,CN 的格式必须为 hostname.domain.[com|org|net|...]。
在本示例中,目录为 domain-dir/config。serverseed.txt 和 clientseed.txt 文件可以包含任何随机文本。此随机文本将用于生成密钥对。
certutil -S -n $SERVER_CERT_NAME -x -t "u,u,u" -s "CN=$HOSTNAME.$HOSTDOMAIN, OU=Java Software, O=Sun Microsystems Inc., L=Santa Clara, ST=CA, C=US" -m 25001 -o $CERT_DB_DIR/Server.crt -d $CERT_DB_DIR -f passfile <$CERT_UTIL_DIR/serverseed.txt |
生成客户机证书。此证书也是一个自签名证书。
certutil -S -n $CLIENT_CERT_NAME -x -t "u,u,u" -s "CN=MyClient, OU=Java Software, O=Sun Microsystems Inc., L=Santa Clara, ST=CA, C=US" -m 25002 -o $CERT_DB_DIR/Client.crt -d $CERT_DB_DIR -f passfile <$CERT_UTIL_DIR/clientseed.txt |
检验前面的项目中生成的证书。
certutil -V -u V -n $SERVER_CERT_NAME -d $CERT_DB_DIR certutil -V -u C -n $CLIENT_CERT_NAME -d $CERT_DB_DIR |
显示可用证书。
certutil -L -d $CERT_DB_DIR |
将 RFC 文本格式的证书导入 NSS 证书数据库。
certutil -A -a -n ${cert.nickname} -t ${cert.trust.options} -f ${pass.file} -i ${cert.rfc.file} -d ${admin.domain.dir}/${admin.domain}/config |
以 RFC 格式从 NSS 证书数据库中导出证书。
certutil -L -a -n ${cert.nickname} -f ${pass.file} -d ${admin.domain.dir}/${admin.domain}/config > cert.rfc |
从 NSS 证书数据库中删除证书。
certutil -D -n ${cert.nickname} -f ${pass.file} -d ${admin.domain.dir}/${admin.domain}/config |
将 NSS 数据库中的证书转换为 JKS 格式
certutil -L -a -n ${cert.nickname} -d ${admin.domain.dir}/${admin.domain}/config > cert.rfc keytool -import -noprompt -trustcacerts -keystore ${keystore.file} -storepass ${keystore.pass} -alias ${cert.alias} -file cert.rfc |
pk12util 是一个命令行实用程序,用于以 PKCS12 格式在证书/密钥数据库和文件之间导入和导出密钥和证书。PKCS12 是公共密钥加密标准 (Public-Key Cryptography Standards, PKCS) #12 个人信息交换语法标准。有关 pk12util 实用程序的更多说明,请参见 http://www.mozilla.org/projects/security/pki/nss/tools/pk12util.html。
将 PKCS12 格式的证书导入 NSS 证书数据库。
pk12util -i ${cert.pkcs12.file} -k ${certdb.pass.file} -w ${cert.pass.file} -d ${admin.domain.dir}/${admin.domain}/config |
将 PKCS12 格式的证书导入 NSS 证书数据库令牌模块。
pk12util -i ${cert.pkcs12.file} -h ${token.name} -k ${certdb.pass.file} -w ${cert.pass.file} -d ${admin.domain.dir}/${admin.domain}/config |
以 PKCS12 格式从 NSS 证书数据库中导出证书。
pk12util -o -n ${cert.nickname} -k ${pass.file} -w${cert.pass.file} -d ${admin.domain.dir}/${admin.domain}/config |
以 PKCS12 格式从 NSS 证书数据库令牌模块中导出证书(用于硬件加速器配置)。
pk12util -o -n ${cert.nickname} -h ${token.name} -k ${pass.file} -w ${cert.pass.file} -d ${admin.domain.dir}/${admin.domain}/config |
将 PKCS12 证书转换为 JKS 格式(需要 Java 源代码):
<target name="convert-pkcs12-to-jks" depends="init-common"> <delete file="${jks.file}" failonerror="false"/> <java classname="com.sun.enterprise.security.KeyTool"> <arg line="-pkcs12"/> <arg line="-pkcsFile ${pkcs12.file}"/> <arg line="-pkcsKeyStorePass ${pkcs12.pass}"/> <arg line="-pkcsKeyPass ${pkcs12.pass}"/> <arg line="-jksFile ${jks.file}"/> <arg line="-jksKeyStorePass ${jks.pass}"/> <classpath> <pathelement path="${s1as.classpath}"/> <pathelement path="${env.JAVA_HOME}/jre/lib/jsse.jar"/> </classpath> </java> </target>
安全性模块数据库工具 modutil 是一个命令行实用程序,用于管理 secmod.db 文件中或硬件令牌中的 PKCS #11(Cryptographic Token Interface Standard,加密令牌接口标准)模块信息。您可以使用此工具添加和删除 PKCS #11 模块、更改密码、设置默认值、列出模块内容、启用或禁用插槽、启用或禁用 FIPS-140-1 兼容性以及指定加密操作的默认提供者。此工具还可以创建 key3.db、cert7.db 和 secmod.db 安全性数据库文件。有关此工具的更多信息,请参见 http://www.mozilla.org/projects/security/pki/nss/tools/modutil.html。
添加新的 PKCS11 模块或令牌。
modutil -add ${token.module.name} -nocertdb -force -mechanisms RSA:DSA:RC4:DES -libfile ${SCA.lib.path} -dbdir ${admin.domain.dir}/${admin.domain}/config |
从 NSS 库中删除 PKCS11 模块。
modutil -delete ${token.module.name} -nocertdb -force -mechanisms RSA:DSA:RC4:DES -libfile ${SCA.lib.path} -dbdir ${admin.domain.dir}/${admin.domain}/config |
列出 NSS 库中的可用令牌模块。
modutil -list -dbdir ${admin.domain.dir}/${admin.domain}/config |