bg-tutorials

如何在JBoss服务器上生成CSR

本教程将向您展示如何在 JBoss EAP 和 WildFly 上使用 Java keytool 工具生成 CSR(证书签名请求)。整个流程分两个命令:首先使用keytool -genkeypair在指定别名下创建密钥库和私钥,然后使用keytool -certreq导出对应的 CSR,其中包含 CA 将签发的使用者备用名称。之后导入已签名的证书时会重复使用同一个别名,因此密钥、CSR 以及最终的证书都保存在同一个位置。

版本说明:目前的主流 JBoss 版本是Red Hat JBoss Enterprise Application Platform (EAP) 8,于 2024 年 2 月发布,其基础是上游的WildFly项目(WildFly 41 于 2026 年 7 月发布,是当前的社区版本)。两者都通过elytron子系统和 Undertow 的https-listener来配置 HTTPS;旧版指南中出现的 Tomcat 或 Jetty 连接器配置已不再适用。不过,CSR 生成步骤在所有近期版本中都是一致的,因为这只是一个普通的 Java keytool操作。

您需要准备的内容

  • 已安装 Java(JDK 或 JRE),以便使用keytool命令。JBoss EAP 8.0 运行在 Java 11(已弃用)或 17 上,EAP 8.1 增加了对 Java 21 的支持,而 WildFly 41 运行在 Java 17、21 或 25 上(上游不再支持 Java 11)。可通过 keytool -help 确认。
  • 可以访问将托管私钥的 JBoss 服务器的 shell 或终端。私钥必须保留在此服务器上。
  • 您要保护的确切完全限定域名(FQDN),例如www.yourdomain.com,以及要在 SAN 字段中涵盖的任何其他主机名。
  • 用于 CSR 可分辨名称的贵组织法律信息(国家、州/省、城市、组织名称)。

步骤 1:创建密钥库和私钥

如果您已经生成了 CSR,请直接跳转到提交 CSR,然后前往在 JBoss 上安装 SSL 证书

在 JBoss 服务器上打开终端,创建一个 PKCS12 格式的新密钥库。PKCS12 是现代的、可移植的标准(RFC 7292),自 JDK 9 起一直是 Java 的默认密钥库格式;旧的专有 JKS 格式已被弃用。运行:

keytool -genkeypair 
  -alias jboss 
  -keyalg RSA -keysize 2048 
  -storetype PKCS12 
  -keystore yourdomain.p12 
  -validity 825

各参数含义如下:

  • -alias jboss:密钥库内条目的名称。请选择一个您能记住的标签(通常是jbossserver或您的域名)。请务必记下来。生成 CSR 时以及日后导入已签名证书时,都必须重复使用完全相同的别名。导入时使用了不同的别名,是 keytool 最常见的错误。
  • -keyalg RSA -keysize 2048:2048 位 RSA 密钥是当前公认的最低标准。如果您打算让密钥库保留数年,升级到 3072 位是合理的选择。大多数公共 CA 也接受 ECDSA(-keyalg EC -groupname secp256r1),如果您更希望使用更小、更快的密钥。-groupname 选项需要 JDK 13 或更高版本;在 Java 11 上请改用 -keyalg EC -keysize 256,它会选择相同的 secp256r1 曲线。keytool 不允许在同一命令中同时使用这两个选项。
  • -storetype PKCS12:强制使用现代的 PKCS12 密钥库。对应的扩展名是 .p12(或 .pfx)。
  • -keystore yourdomain.p12:要创建的密钥库文件。请替换为您能识别的名称,并妥善保管此文件,因为其中包含您的私钥。
  • -validity 825:密钥库内自签名占位证书的有效期。CA 签发的证书稍后会替换它,因此这个具体数值并不影响生产环境中的实际使用寿命。

接下来 keytool 会提示您输入密钥库密码。请设置一个强密码,并将其保存在您的密码管理工具中:后续每次运行 keytool 命令时都需要用到它,并且在 JBoss 中配置 Elytron 的credential-reference时也会用到。对于 PKCS12 密钥库,密钥密码与密钥库密码相同,因此只需要记住一个密码。

步骤 2:输入组织信息(DN)

keytool 接下来会要求输入可分辨名称(DN):即写入 CSR 的身份信息字段。请对每个提示项输入贵组织准确、合法的信息。标点符号和准确性都非常重要,因为如果与公开的商业记录不一致,CA 会拒绝该请求。

  • 名字和姓氏 (CN):这是 keytool 的措辞,但实际上对应的是通用名称(Common Name)字段。请输入您要保护的确切FQDN,例如www.yourdomain.com,或通配符形式如*.yourdomain.com。不要输入个人姓名。
  • 组织单位 (OU):公共 CA 已不再签发此字段,建议留空。请注意,直接按回车键并不会真正让它保持为空:keytool 会自动填入默认值,于是 DN 中最终会带有 OU=Unknown,进而写入 CSR。若要真正省略该字段,请使用下方的非交互式 -dname 方式,并在字符串中不包含 OU。
  • 组织 (O):贵公司的完整法定名称,例如Your Company LLC。OV 和 EV 证书要求填写此项;对于 DV 证书,许多 CA 将其视为信息性内容,因此填写它比留空更稳妥。
  • 城市 (L):完整的城市名称,例如San Jose。不要使用缩写。
  • 州或省 (ST):完整的州或省名称,例如California。不要使用两字母代码。
  • 国家代码 (C):两字母的 ISO 国家代码,例如USGBDE

在最后一个提示项之后,keytool 会显示一段摘要信息,类似 CN=www.yourdomain.com, OU=Unknown, O=Your Company LLC, L=San Jose, ST=California, C=US。输入 yes 进行确认。此时密钥库文件已经创建完成,其中包含一个条目:您的别名,其中保存着私钥和一个自签名的占位证书。

如果您更倾向于使用非交互式命令,可以直接内联传入 DN,跳过所有提示:

keytool -genkeypair 
  -alias jboss 
  -keyalg RSA -keysize 2048 
  -storetype PKCS12 
  -keystore yourdomain.p12 
  -dname "CN=www.yourdomain.com, O=Your Company LLC, L=San Jose, ST=California, C=US" 
  -validity 825

步骤 3:生成带有 SAN 的 CSR

现代浏览器和 TLS 客户端会依据使用者备用名称(SAN)扩展来验证证书,而不仅仅依据通用名称。请在 CSR 中直接申请所需的 SAN,这样 CA 才会将它们包含在签发的证书中。请沿用步骤 1 中的相同别名和密钥库:

keytool -certreq 
  -alias jboss 
  -keystore yourdomain.p12 
  -file yourdomain.csr 
  -ext san=dns:yourdomain.com,dns:www.yourdomain.com

各参数含义如下:

  • -alias jboss:必须与步骤 1 中的别名一致。这个别名对应的私钥将对该请求进行签名。
  • -keystore yourdomain.p12:必须与步骤 1 中的密钥库一致。
  • -file yourdomain.csr:CSR 的输出文件名。
  • -ext san=dns:…:使用者备用名称扩展。请列出证书需要覆盖的每一个主机名,包括根域名(yourdomain.com)和 www 子域名。可以用逗号分隔添加更多条目,例如 dns:api.yourdomain.com

keytool 会提示您输入密钥库密码,并将 CSR 写入当前目录下的yourdomain.csr文件。

关键提示:保留好别名和密钥库

在 JBoss 上最常见的 keytool 错误,就是把签名后的证书导入到一个新的别名下。这样做会导致该证书被存储为一个独立的、可信条目,却没有关联的私钥,从而使 Elytron 密钥管理器无法启动 TLS 会话。请始终将签名后的回复导入到持有私钥的同一个别名下(即步骤 1 中使用的别名)。

在关闭终端之前,请先记下以下这三个值:

  • 别名(本指南中为jboss)。
  • 密钥库文件路径(例如yourdomain.p12;在 JBoss 上,通常位于$JBOSS_HOME/standalone/configuration/)。
  • 密钥库密码

如果您不确定哪个别名持有您的密钥,可以列出密钥库内容,查找类型为PrivateKeyEntry的条目:

keytool -list -v -keystore yourdomain.p12

步骤 4:提交前先验证 CSR

在 CA 验证之前,提前发现 DN 中的拼写错误或缺失的 SAN。使用 keytool 打印 CSR 内容:

keytool -printcertreq -file yourdomain.csr

或者,如果已安装 OpenSSL,也可以改用它:

openssl req -noout -text -in yourdomain.csr

请在输出内容中确认以下三项:Subject显示的是您确切的 DN,Subject Alternative Name列出了您所需的每一个主机名,并且Public-Key的大小与您所选择的一致(2048 位 RSA,或您选定的其他类型)。您也可以将 CSR 粘贴到我们的CSR Decoder中,在浏览器里进行相同的检查。

步骤 5:将 CSR 提交给您的证书颁发机构

使用任意文本编辑器打开yourdomain.csr。该文件是纯文本格式,以 -----BEGIN NEW CERTIFICATE REQUEST----- 开头,以 -----END NEW CERTIFICATE REQUEST----- 结尾。NEW这个词是 keytool 写入的,属于正常现象:其内容仍是每个 CA 都能接受的标准 PKCS#10 请求。请复制整个内容块,包括这些头尾标记行,然后在您的 CA 结账流程中粘贴到 CSR 字段。在 Windows 上,可使用 Ctrl + A 然后 Ctrl + C 来获取全部文本;在 macOS 上,则使用 Cmd + A 然后 Cmd + C

在进行任何其他操作之前,请先备份密钥库文件。如果您丢失了yourdomain.p12,也就意味着丢失了私钥,这将导致 CA 返回的已签名证书无法使用,届时您必须重新生成 CSR,从头开始整个流程。

在 CA 验证您的请求并签发证书之后,请继续参阅如何在 JBoss 上安装 SSL 证书。您需要将签名后的证书重新导入到同一个密钥库中的同一个别名下,然后在配置到 Undertow https-listener 的 Elytron key-storekey-managerserver-ssl-context 中引用该密钥库。

续期时可以重复使用同一个 CSR 吗?

可以,但从安全最佳实践来看,建议为每张证书都生成全新的密钥库、全新的私钥和全新的 CSR。每次续期都使用新密钥,可以在旧密钥一旦泄露时将影响降到最低,具体操作流程相同:针对一个新的密钥库文件运行keytool -genkeypairkeytool -certreq即可。根据 CA/浏览器论坛的规定,公共 TLS 证书的有效期正在不断缩短(自 2026 年 3 月 15 日起为 200 天,2027 年降至 100 天,2029 年进一步降至 47 天),因此请为更频繁的 CSR 更新周期做好规划,或者在您的 CA 支持的情况下,通过 ACME 实现证书签发的自动化。

立即订购 SSL 证书, 可节省 10% 的费用!

快速发行, 强大加密, 99.99% 的浏览器信任度, 专业支持和 25 天退款保证. 优惠券代码 SAVE10

龙飞行的详细图像
撰写人

经验丰富的内容撰稿人, 擅长 SSL 证书. 将复杂的网络安全主题转化为清晰, 引人入胜的内容. 通过有影响力的叙述, 为提高数字安全作出贡献.