# PKCS#12是什么？定义、例子与常见误区

> PKCS#12 是一种用口令保护的二进制容器格式，可以把私钥、证书和证书链打包进一个文件，扩展名通常是 .p12 或 .pfx。

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

PKCS #12 由 RFC 7292 定义，是一种归档格式：一个 DER 编码的文件里可以同时放私钥、证书和 CA 证书，并用口令派生的密钥做完整性保护和加密。它是在系统之间迁移"完整身份"（私钥加[证书链](https://ssl.sh/zh/glossary/certificate-chain/)）的标准方式，也是 Windows、macOS 钥匙串、浏览器和 Java 的原生导入导出格式；Java 9 起默认的 keystore 类型就是 PKCS12。国内常见的例子有 Tomcat、IIS 部署用的证书包，以及一些支付平台下发给商户的 API 证书（如 `apiclient_cert.p12`）。

## 为什么重要
需要私钥和证书一起交付时，PKCS #12 省去了管理多个文件的麻烦，口令也为传输提供了一定保护。内部使用的加密算法会影响兼容性：OpenSSL 3.x 默认用 AES-256 和 PBKDF2 生成文件，而部分老系统只认识基于 RC2/3DES 的旧格式，这时可以用 `-legacy` 参数生成旧格式。Windows 和 IIS 一侧的用法见 [PFX](https://ssl.sh/zh/glossary/pfx/)。

## 例子
```bash
openssl pkcs12 -export -inkey example.com.key -in example.com.crt \
  -certfile chain.pem -name example.com -out example.com.p12
openssl pkcs12 -in example.com.p12 -info -noout
openssl pkcs12 -in example.com.p12 -nodes -out example.com-all.pem
```

## 常见误区
- **.p12 和 .pfx 是两种格式。** 结构完全相同，只是习惯扩展名不同。
- **有口令就可以随便用邮件发送。** 弱口令可以离线暴力破解，应把它当作裸露的[私钥](https://ssl.sh/zh/glossary/private-key/)对待。
- **导入失败一定是口令错了。** 也可能是导入方不支持文件使用的加密算法。

## 相关术语

- [PFX](https://ssl.sh/zh/glossary/pfx/): PFX 是 Windows 和 IIS 用来导入导出证书及其私钥、证书链的 .pfx 文件，格式就是 PKCS#12。
- [PEM](https://ssl.sh/zh/glossary/pem/): PEM 是一种把 DER 二进制数据做 Base64 编码、再用 BEGIN 和 END 行包起来的文本格式，是存放证书和私钥最常见的方式。
- [私钥](https://ssl.sh/zh/glossary/private-key/): 私钥是非对称密钥对中保密的那一半，TLS 服务器用它证明自己拥有证书里的那把公钥。
- [JKS](https://ssl.sh/zh/glossary/jks/): JKS 是 Java 早期默认的专有密钥库文件格式，用来存放私钥、证书链和受信任证书，通过 keytool 管理。
- [KEY 文件](https://ssl.sh/zh/glossary/key-file/): KEY 文件是按惯例存放私钥的 .key 文件，通常为 PEM 编码，但扩展名本身并不说明里面的具体格式。
- [CRT 文件](https://ssl.sh/zh/glossary/crt-file/): CRT 文件是存放 X.509 证书的 .crt 或 .cer 文件，内容可能是 PEM 文本，也可能是二进制 DER，取决于生成它的平台。
- [证书链](https://ssl.sh/zh/glossary/certificate-chain/): 证书链是从网站终端证书经中间证书一直到受信任根证书的有序证书序列，每一张都由下一张签名。
