关键步骤是:先用keytool -list -v查别名,再用-importkeystore转为p12,接着用openssl pkcs12 -nocerts -nodes导私钥、-cacerts导完整证书链,最后校验模数一致并配置nginx的ssl_certificate和ssl_certificate_key。

要把 .jks 或 .keystore 文件中的私钥和证书链完整导出为 Nginx 可用的 PEM 格式(即 .key + .crt),关键在于:先确认别名、转成 PKCS#12(.p12),再分别提取私钥和各级证书,最后合并成完整证书链。整个过程不依赖第三方 GUI 工具,纯命令行即可完成。
第一步:查清 JKS 中的证书条目和别名
JKS 文件可能含多个 entry(如根证书、中间证书、服务器私钥+证书),Nginx 只需要其中一条 PrivateKeyEntry 对应的私钥和它的完整证书链(服务器证书 + 所有中间 CA 证书)。
- 运行命令查看内容:
keytool -list -v -keystore your-app.jks - 输入密钥库密码后,留意输出中类似这样的字段:
Alias name: tomcat<br>Entry type: PrivateKeyEntry<br>Certificate chain length: 2
- 记下 Alias name(比如
tomcat),后续步骤必须指定它,否则会报 “no certificate matches alias”
第二步:将 JKS 转为 PKCS#12(.p12)格式
P12 是通用中间格式,openssl 支持解析,比直接操作 JKS 更可靠。
- 执行转换(务必带上
-srcalias):keytool -importkeystore -srckeystore your-app.jks -srcalias tomcat -destkeystore app.p12 -deststoretype PKCS12 - 过程中会提示输入源密钥库密码(即 JKS 密码)和目标 P12 新密码;建议设为相同密码,避免后续 openssl 提示输错
第三步:从 .p12 中分离私钥和证书
注意:Nginx 的 ssl_certificate 需要的是完整的证书链(服务器证书 + 中间 CA),不能只导出服务器证书。
- 提取私钥(无加密、PEM 格式):
openssl pkcs12 -in app.p12 -nocerts -nodes -out app.key - 提取全部证书(含服务器证书和中间 CA):
openssl pkcs12 -in app.p12 -cacerts -nokeys -out full-chain.pem
⚠️ 不要用-clcerts,它只取服务器证书,会丢失中间链 - 如果
-cacerts输出为空或不全,说明中间证书未存于 JKS 的 trustStore 区域——此时需手动补全:
• 先用-clcerts提取服务器证书 →server.crt
• 向证书签发方获取中间 CA 证书(如intermediate.crt)
• 合并:cat server.crt intermediate.crt > full-chain.pem
第四步:验证与配置 Nginx
导出后务必校验是否可用,避免重启 Nginx 失败。
- 检查私钥是否匹配证书:
openssl x509 -noout -modulus -in full-chain.pem | openssl md5<br>openssl rsa -noout -modulus -in app.key | openssl md5
两个 md5 值必须一致 - Nginx 配置示例:
ssl_certificate /path/to/full-chain.pem;<br>ssl_certificate_key /path/to/app.key;
- 重启前测试语法:
nginx -t











