在本教程中,你将学习如何在 GlassFish(现为 Eclipse GlassFish)上安装 SSL 证书,使用 Java 的 keytool 工具和 asadmin 命令行。
为 GlassFish 生成 CSR 代码
订购 SSL 证书的第一步是创建 CSR(证书签名请求),并将其发送给你的证书颁发机构(也就是你的 SSL 提供商)。CSR 是一段包含你网站及组织信息的文本块。CA 会用它来验证你的身份,因此如果 CSR 包含不正确或过时的信息,CA 将不会为你的证书签名。
在 GlassFish 上,CSR 是通过 keytool 从 Java 密钥库中生成的,而同一个密钥库还保存着安装时会重复使用的私钥。你有两种选择:
- 使用我们的CSR 生成器自动创建 CSR。
- 参照我们关于如何在 GlassFish 中生成 CSR的分步教程。
你可以使用任何文本编辑器(例如 Notepad)打开你的 CSR 文件。在将其发送给 CA 之前,我们建议先做最后一次检查,确认没有拼写错误或其他问题。使用我们的CSR 解码工具进行检查。
根据证书的验证类型,签发时间可能从几分钟到几个工作日不等。一旦 SSL 文件发送到你的邮箱,就可以继续进行下面的安装步骤。
在 GlassFish 上安装 SSL 证书
GlassFish 安装的核心思路是:你的已签名证书必须最终与由 CSR 创建的私钥关联起来。做法是将证书链和已签名证书导入到已经包含该私钥的密钥库中,也就是你生成 CSR 时所使用的同一个密钥库。
第 1 步:提取你的证书文件
你的 CA 会将证书通过邮件发送到你提供的地址,通常是一个 ZIP 压缩包。请将其解压。文件通常以以下两种格式之一提供:
- PEM:单独的文件,通常包括一个 .crt(你的服务器证书)和一个 .ca-bundle(根证书和中间证书)。
- PKCS#7:一个单独的 .p7b(或 .cer)文件,其中已经打包了你的证书及完整的证书链。
第 2 步:将 SSL 文件上传到你的 GlassFish 服务器
将解压后的文件上传到服务器,放到与生成 CSR 时所用密钥库相同的目录下(下文以 mykeystore.jks 表示该密钥库)。PEM 格式需要执行两条导入命令;PKCS#7 只需一条。请选择与你所拥有的文件格式相匹配的方式。
PEM 格式。 先导入 CA 证书包,这样 keytool 才能构建出完整的信任链,然后再导入你的服务器证书。使用以下命令导入 CA 证书包:
keytool -import -trustcacerts -alias ca -file file.ca-bundle -keystore mykeystore.jks
此证书链条目的别名(这里是 ca)可以随意命名,只要它与你私钥的别名不同即可。接下来,将你的已签名服务器证书导入到已存在的私钥别名中,即你生成 CSR 时使用的那个别名:
keytool -import -trustcacerts -alias myalias -file file.crt -keystore mykeystore.jks
这里的 myalias 必须是已经持有你私钥的别名。因为该别名已经关联了一个密钥,keytool 会将此次导入视为一次证书回复(certificate reply),并将已签名证书绑定到该密钥上。这一步正是让 HTTPS 正常运作的关键步骤;请参阅下方的警告说明。
PKCS#7 格式。 .p7b 文件已经包含完整的证书链,因此只需一条命令即可一次性导入全部内容,同样导入到私钥所在的别名中:
keytool -import -trustcacerts -alias myalias -file file.p7b -keystore mykeystore.jks
keytool 会提示你输入密钥库密码。如上所述,myalias 必须与你现有的私钥别名一致。如果你不记得该别名,可以列出密钥库中的内容:
keytool -list -v -keystore mykeystore.jks
查找类型为 PrivateKeyEntry 的条目;该别名即是你的已签名证书必须导入的目标别名。
⚠️ 关键注意事项:切勿将已签名证书导入到一个全新的别名下。如果该别名没有已存在的私钥,keytool 会将证书存储为一个没有关联密钥的独立可信条目,这将导致 TLS 无法正常工作。请始终将证书回复导入到已经持有该密钥的别名中(GlassFish 默认别名为 s1as)。
第 3 步:导入到 GlassFish 默认密钥库中
证书处理完毕后,将你的密钥库导入到 GlassFish 的默认密钥库中。在默认安装环境下,该密钥库位于域的配置目录下,例如 glassfish/domains/domain1/config/keystore.jks(较旧的 GlassFish 4 版本会将此目录嵌套在顶层的 glassfish4/ 文件夹下)。对应的信任库为同一目录下的 cacerts.jks。
注意:GlassFish 默认创建 domain1。如果你添加了自定义域,请使用其对应的目录。
使用以下命令将你的密钥库导入到 GlassFish 密钥库中:
keytool -importkeystore -srckeystore mykeystore.jks -destkeystore keystore.jks
第 4 步:统一密钥库密码
GlassFish 密钥库的密码必须与该域的 GlassFish 主密码(master password)一致。如果主密码、密钥库密码和私钥密码不完全一致,GlassFish 将无法解锁密钥,你的 SSL 证书也无法正常工作。(在新建的域中,默认的密钥库密码为 changeit。)
第 5 步:更新你的 GlassFish 配置
成功导入后,将 GlassFish 的 HTTPS 监听器指向你的证书,使其提供新证书而不是默认的自签名证书。你可以通过浏览器中的GlassFish 管理控制台(Administration Console)来完成此操作,也可以通过手动编辑 domain.xml 来完成。
方式 A:管理控制台。 首先,为该域启用安全管理:
asadmin enable-secure-admin
重启 GlassFish 域(默认名为 domain1)以使更改生效:
asadmin restart-domain domain1
现在打开控制台,地址为 https://yoursite.com:4848。忽略自签名证书的警告并继续。导航到 Configurations > server-config > HTTP Service > HTTP Listeners > http-listener-2。
打开 SSL 选项卡,在 Certificate Nickname 字段中输入你的证书别名(与密钥库别名相同)。然后切换到 General 选项卡,将监听端口改为 443。GlassFish 默认使用 8181 端口进行 HTTPS 通信。保存更改。
有时并非所有配置引用都会在控制台中自动更新为新别名。如果出现这种情况,请通过方式 B 手动完成剩余更改,编辑 domain.xml。
方式 B:编辑 domain.xml。 domain.xml 文件位于相同的配置目录中,例如 glassfish/domains/domain1/config/domain.xml。为安全起见,请先停止该域:
asadmin stop-domain domain1
用文本编辑器打开 domain.xml,使用查找功能(Ctrl+F)定位 s1as,即 GlassFish 的默认证书别名。将所有出现的 s1as 替换为你的证书别名(本教程中为 myalias)。将所有引用都更新,还能让管理控制台同样使用你的证书进行加密保护。
保存 domain.xml,然后重新启动该域:
asadmin start-domain domain1
恭喜,你的 SSL 证书现已在 GlassFish 服务器上安装完成。
测试你的 SSL 安装
安装证书后,运行我们的 SSL 检测工具来测试安装状态。即时扫描会揭示可能影响浏览器如何处理你的证书的任何错误或漏洞(例如缺失中间证书或信任链不完整)。
在哪里购买适用于 GlassFish 的 SSL 证书?
购买适用于 GlassFish 的 SSL 证书,最佳选择是 SSL Dragon。我们提供市场上最具竞争力的价格之一,并针对全线 SSL 产品定期提供折扣,同时与业内最优秀的 SSL 品牌建立了合作关系,以确保强大的加密能力和专业的支持服务。我们所有的 SSL 证书都与 GlassFish 兼容。
为了帮助你做出选择,我们开发了两款免费工具。我们的SSL 向导只需几秒钟即可为你的项目和预算找到最优惠的 SSL 方案。
常见问题
一个 GlassFish 域在其配置目录下附带两个 JKS 文件:keystore.jks,用于保存私钥,以及 cacerts.jks,即可信 CA 证书的信任库。两者默认都位于 domains/domain1/config/ 目录下。安全 HTTP 监听器所使用的默认证书别名为 s1as,默认的密钥库密码为 changeit。
最常见的原因是将已签名证书导入到了一个新的别名下,而不是已经持有你私钥的那个别名。这样 keytool 会将其存储为一个没有关联密钥的可信证书条目,导致 GlassFish 无法完成 TLS 握手。请将已签名的证书回复重新导入到现有的私钥别名中(默认为 s1as)。第二个常见原因是密码不一致;密钥库密码、私钥密码和域主密码必须完全相同。
应先导入 CA 证书包(根证书和中间证书),将其作为可信条目导入。这样在你之后将已签名服务器证书导入到私钥别名时,keytool 就能构建出完整的证书链。如果使用 PKCS#7(.p7b)文件,证书链已经打包在其中,因此一次导入即可处理全部内容。
运行 asadmin restart-domain domain1 即可一步完成更改的生效,或者分别使用 asadmin stop-domain domain1 停止后再用 asadmin start-domain domain1 启动该域。启用安全管理后以及编辑 domain.xml 后,都需要重启。
默认情况下,安全监听器(http-listener-2)使用端口 8181,管理控制台使用端口 4848。若要在标准端口上提供 HTTPS 服务,需在管理控制台或 domain.xml 中将监听端口改为 443。


