PKCS#12 (PKCS #12(.p12 / .pfx))
定义
PKCS#12 是一种用口令保护的二进制容器格式,可以把私钥、证书和证书链打包进一个文件,扩展名通常是 .p12 或 .pfx。
PKCS #12 由 RFC 7292 定义,是一种归档格式:一个 DER 编码的文件里可以同时放私钥、证书和 CA 证书,并用口令派生的密钥做完整性保护和加密。它是在系统之间迁移"完整身份"(私钥加证书链)的标准方式,也是 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。
例子
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 是两种格式。 结构完全相同,只是习惯扩展名不同。
- 有口令就可以随便用邮件发送。 弱口令可以离线暴力破解,应把它当作裸露的私钥对待。
- 导入失败一定是口令错了。 也可能是导入方不支持文件使用的加密算法。