情天的博客 - Java
type: channel
link: https://www.ixleo.com/tag/Java/
items: 使用 JDK 生成 SSL 证书并配置到 Nginx or Tomcat

使用 JDK 生成 SSL 证书并配置到 Nginx or Tomcat
type: item
date: 2025-04-10T15:38:22+00:00
description: 使用 JDK 生成 SSL 证书并配置到 Nginx or Tomcat📌 场景背景在某些内网或开发环境中，我们需要通过 HTTPS 实现服务的安全访问，但由于限制无法使用 Let's Encrypt 等自动证书服务。因此我们选择使用 JDK 自带的工具 keytool​ 来生成 SSL 证书，并将其配置到 Nginx 或 Java（Tomcat/Spring Boot）等服务中。🧰 工具与环境准备安装了 JDK（包含 keytool​ 工具）使用 Java 环境运行的 Spring Boot / Tomcat（如需配置 Java）安装了 Nginx（如需配置 Nginx）安装了 OpenSSL（如需配置 Nginx 用于格式转换）📂 文件路径说明所有命令默认在当前工作目录生成文件。如需指定路径，可通过 -keystore​ 或 -out​ 参数指定，如：​-keystore /your/path/file.jks​​-destkeystore /your/path/file.pfx​​-out /your/path/file.key​ / file.crt​🔐 推荐证书生成方式：直接生成 PKCS12 格式证书（优先推荐）（可直接用于 Spring Boot / Tomcat）命令示例keytool -genkeypair \ -alias myssl \ -keyalg RSA \ -keysize 2048 \ -keystore myssl.p12 \ -storetype PKCS12 \ -validity 365 \ -storepass changeit \ -keypass changeit \ -dname "CN=localhost, OU=Dev, O=Company, L=Beijing, ST=Beijing, C=CN"参数说明​-alias​：密钥别名，用于引用此证书。​-keyalg​：密钥算法，常用 RSA​。​-keysize​：密钥长度，建议 2048 或以上。​-keystore​：输出的证书库文件。​-storetype​：证书类型，推荐使用 PKCS12​。​-validity​：证书有效期（天）。​-storepass​：证书库密码。​-keypass​：私钥密码。​-dname​：证书使用者的身份信息（DN）。配置到 Spring Boot（推荐方式）在 application.yml​ 中添加：server: port: 8880 ssl: enabled: true key-store: classpath:myssl.p12 key-store-password: changeit key-store-type: PKCS12或在 application.properties​ 中：server.port=8880 server.ssl.enabled=true server.ssl.key-store=classpath:myssl.p12 server.ssl.key-store-password=changeit server.ssl.key-store-type=PKCS12⚠️ 注意：classpath:​ 代表证书文件需放入 resources​ 目录，或通过绝对路径引用。从PKCS12 格式证书提取 .crt​ 和 .key​📤 提取 CRT 文件（公钥证书）openssl pkcs12 -in myssl.p12 -clcerts -nokeys -out myssl.crt -passin pass:changeit​-in myssl.p12​: 指定源证书文件​-clcerts​: 只提取客户端证书（不包括 CA 链）​-nokeys​: 不提取私钥​-out myssl.crt​: 输出文件名​-passin pass:changeit​: 输入 .p12​ 密码🔑 提取 KEY 文件（私钥）openssl pkcs12 -in myssl.p12 -nocerts -nodes -out myssl.key -passin pass:changeit​-nocerts​: 不提取证书，只提取私钥​-nodes​: 私钥不加密输出​-out myssl.key​: 输出文件名​-passin pass:changeit​: 输入 .p12​ 密码⚠️ 注意：私钥文件 myssl.key​ 非加密形式，部署前注意文件权限（例如 chmod 600 myssl.key​）将提取的 .crt​ 和 .key​ 配置到 Nginx即可使用执行结果示例🔐 可选方式：JKS → PFX → CRT + KEY（适用于 Nginx）尽管 PKCS12 更推荐，但…