在 Java 应用与 Nginx 混合部署的场景中,经常遇到证书格式不兼容的问题。Java 端习惯使用 JKS 或 PKCS12 格式,而 Nginx 更倾向于标准的 PEM 格式(包含证书和私钥)。为了顺利配置 HTTPS,我们需要将现有的 Java 密钥库转换为 Nginx 可识别的文件。这个过程并不复杂,借助 JDK 自带的 keytool 和开源的 openssl 即可完成。
首先,我们需要将原始的 .jks 文件转换为通用的 PKCS12 格式(.p12)。这一步是中间过渡,因为后续处理私钥和证书需要用到 PKCS12 标准。执行命令时,系统会要求输入源密钥库的密码,请务必确认无误。
keytool -importkeystore -srckeystore oldkeystore.jks -destkeystore newkeystore.p12 -deststoretype PKCS12
转换完成后,建议先检查一下新生成的 .p12 文件内容是否完整,避免后续步骤出错。
keytool -deststoretype PKCS12 -keystore newkeystore.p12 -list
接下来是关键步骤:从 .p12 文件中分离出证书和私钥。注意,这里我们不需要 -nodes 参数来加密私钥,但在实际生产环境中,如果 Nginx 配置允许,保留密码保护也是一种选择;不过为了方便 Nginx 启动脚本自动化,通常我们会提取无密码保护的私钥。
提取证书部分:
openssl pkcs12 -nokeys -in newkeystore.p12 -out certfile.pem
提取私钥部分(移除密码保护):
openssl pkcs12 -nocerts -nodes -in newkeystore.p12 -out keyfile.key
至此,我们就得到了 Nginx 所需的 certfile.pem 和 keyfile.key。最后记得在 Nginx 配置文件中指向这两个新路径,重启服务即可生效。整个过程虽然涉及多个命令,但只要理清了数据流向,实际操作起来非常顺畅。

