bg-tutorials

如何在 Tomcat 上生成 CSR

本教程将向您展示如何使用 Java 的 keytool 工具为 Apache Tomcat 生成 CSR(证书签名请求)。整个流程分两条命令:首先用 keytool -genkeypair 创建一个密钥库并在指定别名下生成私钥,然后用 keytool -certreq 导出对应的 CSR。稍后导入已签发的证书时会重复使用同一个别名,因此密钥、CSR 和最终的证书都保存在同一个位置。

您需要准备的内容

  • 已安装 Java(JDK 或 JRE),以便 keytool 命令可用。可通过 keytool -help 进行确认。
  • 能够对将托管私钥的服务器进行 Shell 或终端访问。私钥必须保留在此服务器上。
  • 要保护的确切完全限定域名(FQDN),例如 www.yourdomain.com,以及您希望覆盖的其他任何域名(用于 SAN 字段)。
  • 您组织的法定信息(国家、州/省、城市、组织名称),用于 CSR 的可分辨名称(Distinguished Name)。

第一步:创建密钥库和私钥

如果您已经生成了 CSR,可直接跳到提交 CSR部分,然后前往在 Tomcat 上安装 SSL 证书

在服务器上打开终端,创建一个 PKCS12 格式的新密钥库。PKCS12 是现代化、可移植的标准,自 JDK 9 起已成为 Java 中默认的密钥库格式;较旧的 JKS 格式已被弃用。运行:

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

各参数的含义如下:

  • -alias tomcat:密钥库内条目的名称。选择一个您能识别的标签(通常是 tomcat 或您的域名)。请记下它。在生成 CSR 以及日后导入已签发证书时,您都必须重复使用完全相同的别名。
  • -keyalg RSA -keysize 2048:2048 位 RSA 密钥是目前公开的最低要求。对于新建密钥库,若想使用寿命更长的密钥,升级到 3072 位是合理的选择。如果您更倾向于更小、更快的密钥,多数公开 CA 也接受 ECDSA(-keyalg EC -groupname secp256r1)。
  • -storetype PKCS12:强制使用现代化的 PKCS12 密钥库。对应的文件扩展名为 .p12(或 .pfx)。
  • -keystore yourdomain.p12:要创建的密钥库文件。将文件名替换为您易于记住的名称,并妥善保管此文件;它包含您的私钥。
  • -validity 825:密钥库内自签名占位证书的有效期。CA 签发的证书稍后会替换该占位证书,因此该数值的具体大小不会影响生产环境中证书的实际有效期。

随后 keytool 会提示输入密钥库密码。请设置一个强密码,并保存在您的密码管理工具中:之后每次运行 keytool 命令以及配置 Tomcat 的 server.xml 时都会用到它。使用 PKCS12 密钥库时,密钥密码与密钥库密码相同,因此只需记住一个密码。

第二步:输入组织信息(DN)

keytool 现在会要求输入可分辨名称(Distinguished Name,DN):即将写入 CSR 的身份信息字段。请针对每个提示输入贵组织的准确、合法的信息。标点符号和准确性都很重要:如与公开的企业注册信息不符,CA 会拒绝该请求。

  • 姓名(CN):这是 keytool 的表述方式,实际对应通用名称(Common Name)字段。请输入您要保护的确切 FQDN,例如 www.yourdomain.com,或通配符如 *.yourdomain.com。不要输入个人姓名。
  • 组织单位(OU):此字段目前已不再由公开 CA 签发使用,最好留空。按 Enter 键跳过。
  • 组织(O):贵公司的完整法定名称,例如 Your Company LLC
  • 城市或地区(L):城市的完整名称,例如 San Jose。请不要使用缩写。
  • 州或省(ST):州或省的完整名称,例如 California。请不要使用两字母代码。
  • 国家代码(C):两字母 ISO 国家代码,例如 USGBDE

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

如果您更倾向于非交互式命令,可以将 DN 直接写入命令,跳过所有提示:

keytool -genkeypair 
  -alias tomcat 
  -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

第三步:生成包含 SAN 的 CSR

现代浏览器和客户端会依据使用者备用名称(Subject Alternative Name,SAN)扩展来验证证书,而不仅仅依据通用名称。请在 CSR 中直接申请所需的 SAN,以便 CA 将其包含在最终签发的证书中。请使用与第一步相同的别名和密钥库:

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

各参数的含义如下:

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

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

重要提示:保留好您的别名和密钥库

在 Tomcat 上使用 keytool 时最常见的错误就是将已签发的证书导入到新的别名下。这样做会将证书作为一个不含任何私钥的独立可信条目存储起来,导致 TLS 无法正常工作。请始终将签名回复的证书导入回持有私钥的同一个别名(即第一步中使用的别名)。

请在关闭终端前,先记下以下三项信息:

  • 别名(在本指南中为 tomcat)。
  • 密钥库文件路径(例如 yourdomain.p12)。
  • 密钥库密码

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

keytool -list -v -keystore yourdomain.p12

第四步:提交前先验证 CSR

在 CA 验证之前,先检查 DN 中是否存在拼写错误或 SAN 缺失。可用 keytool 打印 CSR 内容:

keytool -printcertreq -file yourdomain.csr

或者,如果已安装 OpenSSL,也可以使用它来代替:

openssl req -noout -text -in yourdomain.csr

在输出内容中确认以下三项:Subject 字段显示的是您确切的 DN,使用者备用名称 列出了您需要的所有主机名,以及 Public-Key 的大小与您所选择的一致(2048 位 RSA,或您选择的其他配置)。您也可以将 CSR 粘贴到我们的CSR 解码器中,在浏览器里进行同样的检查。

第五步:将 CSR 提交给证书颁发机构

使用任意文本编辑器打开 yourdomain.csr。该文件是纯文本格式,以 —–BEGIN CERTIFICATE REQUEST—– 开头,以 —–END CERTIFICATE REQUEST—– 结尾。复制整段内容,包括这些起始和结束标记行,并在 CA 的结账流程中粘贴到 CSR 字段。在 Windows 系统上,可使用 Ctrl + A 然后 Ctrl + C 来选取完整文本;在 macOS 系统上,可使用 Cmd + A 然后 Cmd + C

待 CA 验证您的请求并签发证书后,请继续参阅如何在 Tomcat 上安装 SSL 证书。您需要将已签发的证书导回同一密钥库中的同一别名,然后将 Tomcat 的 HTTPS 连接器指向该密钥库。

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

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

龙飞行的详细图像
撰写人

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