Loading... # 使用 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) ### 命令示例 ```bash 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` 中添加: ```yaml server: port: 8880 ssl: enabled: true key-store: classpath:myssl.p12 key-store-password: changeit key-store-type: PKCS12 ``` 或在 `application.properties` 中: ```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 文件(公钥证书) ```bash 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 文件(私钥) ```bash 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 格式证书 ```content 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 格式) ```bash 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 和 KEY ```bash openssl 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`:导出的密钥没有加密。 ### 执行结果示例  ### 配置到 Nginx ```nginx server { # 配置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+KEY|Nginx|`.crt + .key`|通用性强,兼容非 Java 环境|步骤多,需 OpenSSL| --- ## ✅ 总结 * 如果是 Java 应用,建议直接生成 `.p12` 证书并通过 Spring Boot 配置文件完成配置。 * 如果是 Web 服务如 Nginx,建议通过 `.jks → .pfx → .crt/.key` 的流程生成证书。 * 使用 `keytool` 可实现大多数开发、测试环境的 HTTPS 支持,无需购买证书。 可根据中间件环境灵活选择适合的证书生成方式。 最后修改:2025 年 04 月 10 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果文章有帮助到你,请随意赞赏