如何用Java Keytool生成自签名SSL证书
可使用 keytool(JDK 自带工具)通过 -genkeypair 命令直接生成密钥对并自签名证书,无需先生成 CSR。典型命令如下:
keytool -genkeypair -alias myserver \
-keyalg RSA -keysize 2048 \
-storetype PKCS12 -keystore server.p12 \
-validity 365 \
-dname "CN=localhost,OU=Dev,O=MyOrg,L=Beijing,ST=Beijing,C=CN" \
-keypass changeit -storepass changeit该命令生成一个 PKCS#12 格式的密钥库(server.p12),其中包含:RSA 2048 位私钥、自签名的 X.509 v3 证书(有效期 365 天)、主体 DN 为指定值。证书由 keytool 内置的自签名 CA 签发,不经过任何第三方 ssl证书 机构验证。
若需导出 PEM 格式证书供 Nginx/Apache 使用,可分两步操作:
- 导出证书(仅公钥部分):
keytool -exportcert -alias myserver -file server.crt -keystore server.p12 -rfc -storepass changeit - 导出私钥(需借助 OpenSSL 转换):
openssl pkcs12 -in server.p12 -nodes -nocerts -out server.key(提示输入 keystore 密码后输出 PEM 私钥)
注意:自签名证书无法被浏览器默认信任,访问时会触发 NET::ERR_CERT_AUTHORITY_INVALID 等警告;仅适用于开发测试、内网服务或已手动将根证书导入客户端信任库的场景。
需要注意的情况
- 密钥库格式选择:JDK 9+ 默认使用 PKCS12(推荐),旧版 JDK 可能默认 JKS,但 JKS 已被 Oracle 标记为 deprecated(RFC 7292 明确推荐 PKCS#12)
- 主机名匹配:若用于 HTTPS 服务,
CN或subjectAltName必须与实际访问域名一致;keytool 1.8.0_281+ 支持-ext SAN=dns:example.com,ip:192.168.1.10添加 SAN 扩展 - 密码安全:生产环境严禁使用
changeit等默认密码;-keypass与-storepass应设为强密码且分开管理 - 算法兼容性:如需国密支持,keytool 原生不支持 SM2/SM3/SM4,须使用支持国密的 JDK(如江南科友、鼎铉等定制版)或改用 国密SSL证书 专用工具链



京公网安备11010502031690号
网站经营企业工商营业执照
















