# JKS（Java KeyStore）是什么？定义、例子与常见误区

> JKS 是 Java 早期默认的专有密钥库文件格式，用来存放私钥、证书链和受信任证书，通过 keytool 管理。

Source: https://ssl.sh/zh/glossary/jks/
Last updated: 2026-11-10

JKS（Java KeyStore）是 Java 9 之前默认使用的密钥库格式。密钥库里的条目按别名（alias）存放，分为私钥条目（私钥加对应的[证书链](https://ssl.sh/zh/glossary/certificate-chain/)）和受信任证书条目。同一种文件格式承担两种角色：keystore 存放服务端或客户端自己的身份，[truststore](https://ssl.sh/zh/glossary/trust-store/) 存放 Java 应用信任的 CA 证书。从 Java 9 开始默认类型改为 [PKCS#12](https://ssl.sh/zh/glossary/pkcs12/)，keytool 也会提示 JKS 是专有格式，建议迁移。

## 为什么重要
Tomcat、Kafka、Elasticsearch、Spring Boot 等 Java 服务都通过 keystore、truststore 文件和密码来配置 TLS，大量存量系统仍在用 .jks。国内云厂商的 Tomcat 格式下载包里，常见的是 .jks 或 .pfx 文件加一个记录密码的文件。常见的"PKIX path building failed"报错，意思是 truststore 无法构建到受信任 CA 的证书链；服务端常见的问题则是私钥条目里缺少中间证书，桌面浏览器也许能容忍，其他客户端却会直接报错。

## 例子
```bash
keytool -importkeystore -srckeystore example.com.p12 -srcstoretype PKCS12 \
  -destkeystore example.com.jks -deststoretype JKS
keytool -list -v -keystore example.com.jks
keytool -importcert -alias internal-root -file root.crt -keystore truststore.jks
```

## 常见误区
- **Java 只能用 JKS。** 现代 Java 原生支持并默认使用 PKCS #12。
- **keystore 和 truststore 是一回事。** 格式相同，内容不同：一个放自己的私钥，一个放信任的 CA。
- **只导入站点证书就够了。** 私钥条目需要完整证书链，CA 回复要导入到持有私钥的那个别名下。

## 相关术语

- [PKCS#12](https://ssl.sh/zh/glossary/pkcs12/): PKCS#12 是一种用口令保护的二进制容器格式，可以把私钥、证书和证书链打包进一个文件，扩展名通常是 .p12 或 .pfx。
- [信任库](https://ssl.sh/zh/glossary/trust-store/): 信任库是操作系统、浏览器或编程语言运行时内置的一组根 CA 证书，验证证书链时以它们作为信任锚。
- [私钥](https://ssl.sh/zh/glossary/private-key/): 私钥是非对称密钥对中保密的那一半，TLS 服务器用它证明自己拥有证书里的那把公钥。
- [证书链](https://ssl.sh/zh/glossary/certificate-chain/): 证书链是从网站终端证书经中间证书一直到受信任根证书的有序证书序列，每一张都由下一张签名。
- [PFX](https://ssl.sh/zh/glossary/pfx/): PFX 是 Windows 和 IIS 用来导入导出证书及其私钥、证书链的 .pfx 文件，格式就是 PKCS#12。
- [客户端证书](https://ssl.sh/zh/glossary/client-certificate/): 客户端证书是 TLS 客户端在握手时出示、用来向服务器证明自身身份的 X.509 证书。
