CSDN博客

img xhp317

在 GlassFish v2 中使用 SSL

发表于2008/10/2 22:03:00  903人阅读

 大多数企业应用程序都需要在安全环境中运行。传输层安全(TLS)/安全套接层(SSL)是一种点对点的安全传输机制,可用于验证客户端和服务器之间交换的消息,并确保消息的完整性和机密性。TLS/SSL(或在本文中,就是“SSL”)可满足大多数企业应用环境的安全要求,因此得到了广泛应用。

  无论如何参与 SSL 保护的信息交换,服务器都需要成为 SSL 服务器。本文将介绍如何使 GlassFish v2 应用程序服务器成为 SSL 服务器。

  为了理解这些步骤,您需要理解 SSL 中的一些基本概念(比如密钥和证书),并对 GlassFish v2 中的 profile(配置)有所了解。

  密钥和证书

  密钥和证书是 SSL 中的两个重要概念。密钥用于在客户端和服务器之间的传输中建立信任和隐私。SSL 使用公钥加密法,这种加密法是基于密钥对的。密钥对包含一个公钥和一个私钥。如果用其中一个密钥加密了数据,则只能用密钥对中的另外一个密钥来解密。

  证书用于验证。要使用 SSL,服务器必须拥有其可以连接的每个客户端 IP 地址的相关证书。证书标识了服务器站点的所有者并提供相关的信息。证书由其所有者进行了加密数字签名。对于验证非常重要的网站,可以从值得信赖的知名证书认证机构(CA)购买。但是,如果验证并不特别重要,网站也可以使用自签名的证书。

  GlassFish v2 配置

  GlassFish v2 支持多种配置。每个配置都预置了配置参数,用于应用程序服务器为某种特定用途对其进行优化。它支持三种配置:developer(开发人员)、cluster(集群)和enterprise(企业)。

  开发人员配置可优化 GlassFish v2 适用于开发环境。这表示配置参数支持类似快速启动的目标,但是不支持登录或会话复制。集群配置将设置支持集群创建和会话复制的配置参数。集群是一组可作为单个逻辑实体管理和监视的 GlassFish v2 实例。企业配置可优化 GlassFish v2 适用于生产环境。它支持登录和其他安全相关的功能。

  使 GlassFish v2 应用程序服务器成为 SSL 服务器

  使 GlassFish v2 成为 SSL 服务器的步骤取决于应用服务器的配置。首先让我们来查看一下使用开发人员配置时的过程。然后再查看使用企业配置时的过程。

  使用开发人员配置

  再次提醒:GlassFish v2 配置预置了某种特定使用类型的配置参数。这些参数中有一种是 Security Store,它可以确定如何存储安全和信任相关的事物,比如证书和密钥。对于开发人员配置,Security Store 值设置为 JKS。在本例中,服务器的证书和密钥存储在 Java keystore 文件(keystore.jks)中,而信任的 CA 签发的证书存储在证书文件(cacerts.jks)中。

  安装 GlassFish v2 时,它会创建一个默认的自签名证书作为服务器证书。但是,如果验证对您的网站非常重要,则您需要将该自签名证书替换为由 CA 签发的数字签名证书。本节将介绍如何替换该自签名证书、如何从 CA 获得服务器证书以及如何将服务器证书导入到 keystore。

  以下步骤需要使用 keytool,它是一种密钥和证书管理工具。Keytool 在多种版本的 Java Platform. 、Standard Edition(Java SE)Development Kit(jdk)中均可获得。但是,Java SE 6 在 keytool 中添加了一些必要的功能。以下教程基于 jdk 6 版本的 keytool。有关 keytool 的详细信息,请参阅 JDK Tools and Utilities。

  应用服务器使用开发人员配置时,可采用以下步骤使 GlassFish v2 成为 SSL 服务器。

  使用以下命令删除默认的自签名证书(注意:出于格式目的,以下及以后步骤中的命令分多行显示):

         keytool -delete -alias s1as -keystore keystore.jks

         -storepass

  其中, 是 keystore 的密码,例如 mypass。注意:s1as 是 GlassFish v2 keystore 的默认别名。

  使用以下命令为应用程序服务器生成新密钥对:

        keytool -genkeypair -keyalg 

        -keystore keystore.jks -validity  -alias s1as

  其中, 是用于生成密钥对的算法,例如 RSA。 为证书的有效天数,例如 365。

  注意:除了生成密钥对,该命令会将公钥包含到一个自签名的证书中,并将证书和私钥存储在一个由该别名标识的新 keystore 条目中。

  确保证书的名称与网站的完全限定主机名匹配是非常重要的。如果名称不匹配,则连接到服务器的客户端将会看到一个安全警告,提示证书的名称与站点的名称不匹配。你应该注意到默认的自签名证书的名称与完全限定的主机名匹配。

  通过以下命令生成证书签名请求(CSR):

        keytool -certreq -alias s1as -file 

        -keystore keystore.jks -storepass

  其中, 是存储 CSR 的文件,例如 s1as.csr,而 为 keystore 的密码,例如 changeit。

  将 CSR 提交到 CA,比如 VeriSign。您将收到一个签名的服务器证书作为回应。确保将 CA 的 CA 证书以及 CA 在回应中表明的任何中间证书导入到浏览器。

  将来自的 CA 的已签名服务器证书(包括标记 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----)存储到某个文件中,比如 s1as.cert。下载 CA 证书以及所有中间 CA 证书,并将它们存储到本地文件中。参考浏览器文档中有关如何将 CA 和中间 CA 证书导入到浏览器的说明。CA 可能提供了如何将 CA 证书导入到各种浏览器(Mozilla 和 Internet Explorer)的信息。

  使用从 CA 获得的证书(存储在一个文件中,比如 s1as.cert)代替原始的自签名证书。您可以使用 keytool 来执行此任务,但是需要好几步来执行。运行以下 Java 程序来执行该替换会比较容易:

        import java.io.*;

        import java.security.Key;

        import java.security.KeyStore;

        import java.security.cert.Certificate;

        import java.security.cert.CertificateFactory;

        import java.security.cert.X509Certificate;

       

        

        public class Main {

            public static void main(String[] args) throws Exception {

              //args[] error checking logic omitted

              //file containing signed cert reply from CA

              String csrReplyFromCA = args[0];    

              //Path to GlassFish keystore.jks

              String keystoreLocation = args[1];  

              //Password for GlassFish keystore.jks

              String keystorePassword = args[2];  

              //The keyalias to be replaced : s1as in our example

              String selfSignedKeyEntry = args[3];

              

              //create the signed Cert

              Certificate cert = null;

              FileInputStream fis =

                 new FileInputStream(csrReplyFromCA);

              CertificateFactory cf =

                 CertificateFactory.getInstance("X.509");

              cert = cf.generateCertificate(fis);

              

              //now replace the original entry

              char[] passwordChars =

                 keystorePassword.toCharArray();

              KeyStore keystore = KeyStore.getInstance("JKS");

              keystore.load(new FileInputStream(keystoreLocation),

                 passwordChars);

              Key key = keystore.getKey(selfSignedKeyEntry,

                 passwordChars);

              keystore.setKeyEntry(selfSignedKeyEntry, key,

                 passwordChars, (new Certificate[]{cert}));

              keystore.store(new FileOutputStream(

                 keystoreLocation), passwordChars);

            }

        }

  运行该程序后,您会发现 GlassFish keystore 中的证书 s1as 已不再是原始的自签名证书,而是来自 CA 的证书。这里有一个例子,比较了原始 s1as 证书和从 VeriSign 获得的新 s1as 证书:

  原始 s1as(自签名):

  Owner: CN=KUMAR, U=Sun Java System Application Server, O=Sun

  Microsystems, L=Santa Clara, ST=California, C=US

  Issuer: CN=KUMAR, U=Sun Java System Application Server, O=Su

  n Microsystems, L=Santa Clara, ST=California, C=US

  Serial number: 472acd34

  Valid from: Fri Nov 02 12:39:40 GMT+05:30 2007 until: Mon Oct

  30 12:39:40 GMT+05:30 2017

  新 s1as(包含来自 CA 的签名证书):

  Owner: CN=KUMAR, U=Terms of use atwww.verisign.com/cps/test

  ca (c)05, U=Sun Java System Application Server, O=Sun Micros

  ystems, L=Santa Clara, ST=California, C=US

  Issuer: CN=VeriSign Trial Secure Server Test CA, U=Terms of

  use athttps://www.verisign.com/cps/testca(c)05, U="For Test

  Purposes Only. No assurances.", O="VeriSign, Inc.", C=US

  Serial number: 1375de18b223508c2cb0123059d5c440

  Valid from: Sun Nov 11 05:30:00 GMT+05:30 2007 until: Mon Nov

  26 05:29:59 GMT+05:30 2007

  执行这些步骤之后,您可以重启 GlassFish v2 并使用由 CA 签发的签名服务器证书。

  使用集群配置

  当应用程序使用集群配置进行配置时,和使用开发人员配置一样,你可以执行同样的步骤使 GlassFish v2 成为 SSL 服务器。但是,在这种情况下,你需要确保在集群的所有应用程序服务器实例中复制同一个服务器密钥。

  使用企业配置

  企业配置的 Security Store 参数值为 NSS,表示 Network Security Services(网络安全服务)。在 NSS 安全基础结构中,没有 JKS keystore,因此没有默认的 GlassFish keystore。

  但使用企业配置时,使 GlassFish v2 应用程序服务器成为 SSL 服务器的大部分步骤与使用开发人员配置时的步骤是一样的。但是也有两处不同。第一个不同与该过程的第一步有关。由于没有 JKS keystore,您需要使用空的 keystore(keystore.jks)启动该过程。第二个不同与该过程的最后一步有关。您需要将生成的签名证书导入到 NSS store,而不是 JKS keystore。换句话说,要使 GlassFish v2 应用程序服务器成为 SSL 服务器,您需要执行和 当使用开发人员配置时 这一节中同样的步骤,但是使用空的 keystore 开始,并且将该部分中的第 6 步替换为以下步骤:

  通过以下命令,将 keystore 中的服务器证书的私钥以加密邮件(PEM)格式导出:

        keyexport.bat -keyfile serverkey.pem

        -keystore keystore.jks -storepass changeit -alias s1as

  该命令将调用 keyexport 实用工具。您可以在 keyexport 包中找到 keyexport,可以通过 Project Metro 的 XWSS 下载页面 下载该程序包。

  作为响应,系统将提示需要输入 keystore 密码。该 Keystore 密码和密钥密码是一样的,因此您可以通过简单地按下回车键进行回应。

  这会创建一个 serverkey.pem 文件,该文件在标志 -----BEGIN PRIVATE KEY----- 和 -----END PRIVATE KEY----- 下包含服务器私钥。

  将来自 CA 的签名证书回应(包括 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----- 标志)附加到 servercert.pem 文件。将回应附加到 END PRIVATE KEY 标志的下面。

  将 serverkey.pem 文件转换为 PKCS#12 文件(具有 .pfx 扩展名的文件)。“PKCS”指由 RSA Security 设计并发布的一组公钥加密标准。PKCS#12 定义了一种通常用于存储具有相应公钥证书的私钥的格式,使用基于密码的对称密钥进行保护。

  您可以使用多种工具将 serverkey.pem 文件转换为 PKCS#12 文件。openssl 即为其中的一个工具。这里是使用 openss1 转换文件的命令:

        openssl pkcs12  -export  -in serverkey.pem -out s1as.pfx

  作为响应,系统将提示需要输入导出密码。输入密码,比如 changeit 或 GlassFish 主密码。

  s1as.pfx 文件现在将包含所需的签名服务器证书和私钥。

  通过以下命令,删除原始 s1as 自签名条目(如果存在):

        certutil -D -n s1as -d $AS_NSS_DB

  通过以下命令,使用 pk12util 实用工具将新的 s1as.pfx 文件导入 NSS store:

        pk12util -i s1as.pfx -d $AS_NSS_DB

  pk12util 是一种 NSS 实用工具,它位于 GlassFish 企业配置的安装模板目录下。该实用工具用于将 PCKS#12 文件导入 NSS store 或从中导出。

  为响应该命令,系统将提示输入 NSS 软令牌和 PKCS#12 文件的密码。提供相应的密码。然后您将看到以下消息,表示导入成功:

        pk12util: PKCS12 IMPORT SUCCESSFUL  

  还有两个问题需要注意:

  应用程序服务器配置为企业配置,并且服务器密钥对已存在于 PKCS#12 文件中。如果在 store 中已存在别名为 s1as 的条目,则您只需要执行“当使用企业配置时”中说明的第 4 步来删除该原始条目:

        certutil -D -n s1as -d $AS_NSS_DB

  然后执行第 5 步将新的 s1as.pfx 文件导入到 NSS store:

        pk12util -i s1as.pfx -d $AS_NSS_DB

  如果在 store 中没有别名为 s1as 的条目,则直接执行第 5 步。

  应用程序服务器配置为开发人员配置,并且服务器密钥对已存在于 PKCS#12 文件中。在这种情况下,你只需要按 当使用企业配置时 中说明的第 5 步删除原始 s1as 条目即可。然后使用 pkcs12import 实用工具将 PCKS#12 文件导入 GlassFish keystore:

       pkcs12import.sh -file s1as.pfx -alias s1as

       -keystore keystore.jks -storepass changeit

       -pass

  其中, 为导出 PKCS#12 文件时使用的密码,例如 changeit。

  您可以在 pkcs12import 包中找到 pkcs12import 实用工具,可以通过 Project Metro 的 XWSS 下载页面 下载该程序包。


0 0

相关博文

我的热门文章

img
取 消
img