术语表

PKCS#7 (PKCS #7(.p7b / .p7c))

最后核实

定义

PKCS#7 是一种用于签名和加密数据的格式,在 .p7b 或 .p7c 文件中常用来打包一组证书,不含私钥。

PKCS #7 以 RFC 2315 发布,后来由 IETF 发展为密码消息语法 CMS(RFC 5652),定义了签名数据、加密(封装)数据等受保护数据的容器。其中 SignedData 结构带有一个证书字段,只放证书、不含内容和签名的"仅证书"SignedData 就成了传递证书链的便捷方式。这类文件扩展名一般是 .p7b 或 .p7c,可以是带 BEGIN PKCS7 头的 PEM,也可以是二进制 DER。

为什么重要

一些 CA 和 Windows 工具会把签发的证书及中间证书打包成 .p7b 交付,Java keytool 导入 CA 回复时也接受 PKCS #7 证书链。S/MIME 邮件和 Windows Authenticode 代码签名用的也是同一种结构。部署到 nginx、Apache 等 Web 服务器时,一般要先把 .p7b 转成 PEM 证书链,并把站点证书放在最前面,因为这些服务器只读 PEM,不读 PKCS #7。

例子

openssl pkcs7 -in example.com.p7b -print_certs -out example.com-chain.pem
# 如果是二进制文件,加上:-inform DER
openssl crl2pkcs7 -nocrl -certfile fullchain.pem -out example.com.p7b

常见误区

  • .p7b 里有私钥。 它只放证书(可选 CRL),从不包含私钥;私钥要一起迁移时用 PKCS #12。
  • .p7b 里的证书按链的顺序排列。 证书字段是无序集合,生成 PEM 链时要自己按"站点证书在前"重新排序。
  • PKCS #7 只是证书格式。 它的主要用途是签名和加密消息,打包证书只是附带用法。

延伸阅读