使用 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 更推荐，但在某些场景需要的情况下，我们仍可以从 JKS 开始生成证书。步骤 1：生成 JKS 格式证书keytool -genkeypair \ -alias myssl \ -keyalg RSA \ -keysize 2048 \ -keystore myssl.jks \ -validity 365 \ -storepass changeit \ -keypass changeit \ -dname "CN=localhost, OU=Dev, O=Company, L=Beijing, ST=Beijing, C=CN"参数说明：​-genkeypair​：生成一对公钥和私钥。​-alias​：指定密钥对的别名，用于标识该密钥对。​-keyalg​：指定加密算法，通常为 RSA​。​-keysize​：指定密钥的长度，通常为 2048​ 位。​-keystore​：指定存储密钥对的密钥库文件（myssl.jks​）。默认情况下，如果未指定路径，文件会生成在当前目录。​-validity​：证书的有效期，单位是天数。​-storepass​：密钥库的密码，用于保护密钥库。​-keypass​：密钥的密码，用于保护密钥对。​-dname​：指定证书的 DN（Distinguished Name），通常包含组织信息、域名等。步骤 2：将 JKS 转换为 PFX (PKCS12 格式)keytool -importkeystore \ -srckeystore myssl.jks \ -destkeystore myssl.pfx \ -deststoretype PKCS12 \ -srcalias myssl \ -srcstorepass changeit \ -deststorepass changeit参数说明：​-importkeystore​：导入密钥库，将 JKS 格式的密钥库转换为其他格式（在此为 PFX 格式）。​-srckeystore​：源密钥库的路径（在此为 myssl.jks​）。​-destkeystore​：目标密钥库的路径（在此为 myssl.pfx​）。​-deststoretype​：目标密钥库的类型，选择 PKCS12​ 格式。​-srcalias​：源密钥的别名。​-srcstorepass​：源密钥库的密码。​-deststorepass​：目标密钥库的密码。步骤 3：使用 OpenSSL 提取 CRT 和 KEYopenssl pkcs12 -in myssl.pfx -clcerts -nokeys -out myssl.crt -passin pass:changeit openssl pkcs12 -in myssl.pfx -nocerts -nodes -out myssl.key -passin pass:changeit参数说明：​openssl pkcs12​：使用 OpenSSL 工具来提取 PFX 文件中的证书和密钥。​-in​：指定输入文件，这里是 .pfx​ 文件。​-clcerts​：仅提取证书。​-nokeys​：不提取密钥。​-out​：输出文件（例如 myssl.crt​）。​-nocerts​：仅提取密钥，不提取证书。​-nodes​：导出的密钥没有加密。执行结果示例配置到 Nginxserver { # 配置ssl listen 8880 ssl; server_name localhost; # 配置证书路径和协议 ssl_certificate /path/to/myssl.crt; ssl_certificate_key /path/to/myssl.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1:3000; } }📊 方式对比与适用场景方式适用中间件输出格式优点缺点直接生成 PKCS12（.p12）Spring Boot / Tomcat​.p12​通用格式，配置简单，推荐方式不直接适用于 Nginx(可提取CRT+KEY)JKS → PFX → CRT+KEYNginx​.crt + .key​通用性强，兼容非 Java 环境步骤多，需 OpenSSL✅ 总结如果是 Java 应用，建议直接生成 .p12​ 证书并通过 Spring Boot 配置文件完成配置。如果是 Web 服务如 Nginx，建议通过 .jks → .pfx → .crt/.key​ 的流程生成证书。使用 keytool​ 可实现大多数开发、测试环境的 HTTPS 支持，无需购买证书。可根据中间件环境灵活选择适合的证书生成方式。